From 91434f7721954465e21c52373dcb53f5881d6160 Mon Sep 17 00:00:00 2001
From: Andrei Stefan
Date: Tue, 23 Oct 2018 11:04:16 +0300
Subject: [PATCH 01/24] SQL: the SSL default configuration shouldn't override
the https protocol if used (#34635)
* The default SSL option shouldn't override the https protocol if specified. Fixes https://github.com/elastic/elasticsearch/issues/33817
---
.../sql/jdbc/JdbcConfigurationTests.java | 29 +++++++++++++++++--
.../sql/client/ConnectionConfiguration.java | 17 ++---------
.../xpack/sql/client/SslConfig.java | 16 ++++++++--
3 files changed, 44 insertions(+), 18 deletions(-)
diff --git a/x-pack/plugin/sql/jdbc/src/test/java/org/elasticsearch/xpack/sql/jdbc/JdbcConfigurationTests.java b/x-pack/plugin/sql/jdbc/src/test/java/org/elasticsearch/xpack/sql/jdbc/JdbcConfigurationTests.java
index c7f2b50ace0..1497545d893 100644
--- a/x-pack/plugin/sql/jdbc/src/test/java/org/elasticsearch/xpack/sql/jdbc/JdbcConfigurationTests.java
+++ b/x-pack/plugin/sql/jdbc/src/test/java/org/elasticsearch/xpack/sql/jdbc/JdbcConfigurationTests.java
@@ -73,15 +73,40 @@ public class JdbcConfigurationTests extends ESTestCase {
assertThat(ci.debugOut(), is("jdbc.out"));
}
- public void testHttpWithSSLEnabled() throws Exception {
+ public void testHttpWithSSLEnabledFromProperty() throws Exception {
JdbcConfiguration ci = ci("jdbc:es://test?ssl=true");
assertThat(ci.baseUri().toString(), is("https://test:9200/"));
}
+
+ public void testHttpWithSSLEnabledFromPropertyAndDisabledFromProtocol() throws Exception {
+ JdbcConfiguration ci = ci("jdbc:es://http://test?ssl=true");
+ assertThat(ci.baseUri().toString(), is("https://test:9200/"));
+ }
+
+ public void testHttpWithSSLEnabledFromProtocol() throws Exception {
+ JdbcConfiguration ci = ci("jdbc:es://https://test:9200");
+ assertThat(ci.baseUri().toString(), is("https://test:9200/"));
+ }
+
+ public void testHttpWithSSLEnabledFromProtocolAndProperty() throws Exception {
+ JdbcConfiguration ci = ci("jdbc:es://https://test:9200?ssl=true");
+ assertThat(ci.baseUri().toString(), is("https://test:9200/"));
+ }
- public void testHttpWithSSLDisabled() throws Exception {
+ public void testHttpWithSSLDisabledFromProperty() throws Exception {
JdbcConfiguration ci = ci("jdbc:es://test?ssl=false");
assertThat(ci.baseUri().toString(), is("http://test:9200/"));
}
+
+ public void testHttpWithSSLDisabledFromPropertyAndProtocol() throws Exception {
+ JdbcConfiguration ci = ci("jdbc:es://http://test?ssl=false");
+ assertThat(ci.baseUri().toString(), is("http://test:9200/"));
+ }
+
+ public void testHttpWithSSLDisabledFromPropertyAndEnabledFromProtocol() throws Exception {
+ Exception e = expectThrows(JdbcSQLException.class, () -> ci("jdbc:es://https://test?ssl=false"));
+ assertEquals("Cannot enable SSL: HTTPS protocol being used in the URL and SSL disabled in properties", e.getMessage());
+ }
public void testTimoutOverride() throws Exception {
Properties properties = new Properties();
diff --git a/x-pack/plugin/sql/sql-client/src/main/java/org/elasticsearch/xpack/sql/client/ConnectionConfiguration.java b/x-pack/plugin/sql/sql-client/src/main/java/org/elasticsearch/xpack/sql/client/ConnectionConfiguration.java
index 0de71d27471..5314b7450a5 100644
--- a/x-pack/plugin/sql/sql-client/src/main/java/org/elasticsearch/xpack/sql/client/ConnectionConfiguration.java
+++ b/x-pack/plugin/sql/sql-client/src/main/java/org/elasticsearch/xpack/sql/client/ConnectionConfiguration.java
@@ -98,7 +98,7 @@ public class ConnectionConfiguration {
user = settings.getProperty(AUTH_USER);
pass = settings.getProperty(AUTH_PASS);
- sslConfig = new SslConfig(settings);
+ sslConfig = new SslConfig(settings, baseURI);
proxyConfig = new ProxyConfig(settings);
this.baseURI = normalizeSchema(baseURI, connectionString, sslConfig.isEnabled());
@@ -126,20 +126,9 @@ public class ConnectionConfiguration {
private static URI normalizeSchema(URI uri, String connectionString, boolean isSSLEnabled) {
- // Make sure the protocol is correct
- final String scheme;
- if (isSSLEnabled) {
- // It's ok to upgrade from http to https
- scheme = "https";
- } else {
- // Silently downgrading from https to http can cause security issues
- if ("https".equals(uri.getScheme())) {
- throw new ClientException("SSL is disabled");
- }
- scheme = "http";
- }
try {
- return new URI(scheme, null, uri.getHost(), uri.getPort(), uri.getPath(), uri.getQuery(), uri.getFragment());
+ return new URI(isSSLEnabled ? "https" : "http", null, uri.getHost(), uri.getPort(), uri.getPath(), uri.getQuery(),
+ uri.getFragment());
} catch (URISyntaxException ex) {
throw new ClientException("Cannot parse process baseURI [" + connectionString + "] " + ex.getMessage());
}
diff --git a/x-pack/plugin/sql/sql-client/src/main/java/org/elasticsearch/xpack/sql/client/SslConfig.java b/x-pack/plugin/sql/sql-client/src/main/java/org/elasticsearch/xpack/sql/client/SslConfig.java
index fecfb44492c..9e89f7b848c 100644
--- a/x-pack/plugin/sql/sql-client/src/main/java/org/elasticsearch/xpack/sql/client/SslConfig.java
+++ b/x-pack/plugin/sql/sql-client/src/main/java/org/elasticsearch/xpack/sql/client/SslConfig.java
@@ -7,6 +7,7 @@ package org.elasticsearch.xpack.sql.client;
import java.io.IOException;
import java.io.InputStream;
+import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -62,8 +63,19 @@ public class SslConfig {
private final SSLContext sslContext;
- SslConfig(Properties settings) {
- enabled = StringUtils.parseBoolean(settings.getProperty(SSL, SSL_DEFAULT));
+ SslConfig(Properties settings, URI baseURI) {
+ boolean isSchemaPresent = baseURI.getScheme() != null;
+ boolean isSSLPropertyPresent = settings.getProperty(SSL) != null;
+ boolean isHttpsScheme = "https".equals(baseURI.getScheme());
+
+ if (!isSSLPropertyPresent && !isSchemaPresent) {
+ enabled = StringUtils.parseBoolean(SSL_DEFAULT);
+ } else {
+ if (isSSLPropertyPresent && isHttpsScheme && !StringUtils.parseBoolean(settings.getProperty(SSL))) {
+ throw new ClientException("Cannot enable SSL: HTTPS protocol being used in the URL and SSL disabled in properties");
+ }
+ enabled = isHttpsScheme || StringUtils.parseBoolean(settings.getProperty(SSL, SSL_DEFAULT));
+ }
protocol = settings.getProperty(SSL_PROTOCOL, SSL_PROTOCOL_DEFAULT);
keystoreLocation = settings.getProperty(SSL_KEYSTORE_LOCATION, SSL_KEYSTORE_LOCATION_DEFAULT);
keystorePass = settings.getProperty(SSL_KEYSTORE_PASS, SSL_KEYSTORE_PASS_DEFAULT);
From 0536635c44b56687f6aeea241b758e2c37363d18 Mon Sep 17 00:00:00 2001
From: Alpar Torok
Date: Tue, 23 Oct 2018 12:06:46 +0300
Subject: [PATCH 02/24] Upgrade forbiddenapis to 2.6 (#33809)
* Upgrade forbiddenapis to 2.6
Closes #33759
* Switch forbiddenApis back to official plugin
* Remove CLI based task
* Fix forbiddenApisJava9
---
buildSrc/build.gradle | 1 +
.../gradle/precommit/PrecommitTasks.groovy | 79 ++++----
.../precommit/ForbiddenApisCliTask.java | 177 ------------------
.../gradle/precommit/ThirdPartyAuditTask.java | 2 +-
client/rest/build.gradle | 4 +-
distribution/tools/launchers/build.gradle | 7 +-
libs/core/build.gradle | 3 +-
plugins/analysis-icu/build.gradle | 4 +-
server/build.gradle | 3 +-
x-pack/plugin/security/cli/build.gradle | 4 +-
x-pack/plugin/sql/sql-cli/build.gradle | 4 +-
11 files changed, 53 insertions(+), 235 deletions(-)
delete mode 100644 buildSrc/src/main/java/org/elasticsearch/gradle/precommit/ForbiddenApisCliTask.java
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
index da8ad788164..82b1d8525b1 100644
--- a/buildSrc/build.gradle
+++ b/buildSrc/build.gradle
@@ -106,6 +106,7 @@ dependencies {
compile 'org.apache.rat:apache-rat:0.11'
compile "org.elasticsearch:jna:4.5.1"
compile 'com.github.jengelman.gradle.plugins:shadow:2.0.4'
+ compile 'de.thetaphi:forbiddenapis:2.6'
testCompile "junit:junit:${props.getProperty('junit')}"
}
diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/precommit/PrecommitTasks.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/precommit/PrecommitTasks.groovy
index e89d05e8508..0e706aa5956 100644
--- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/precommit/PrecommitTasks.groovy
+++ b/buildSrc/src/main/groovy/org/elasticsearch/gradle/precommit/PrecommitTasks.groovy
@@ -19,7 +19,10 @@
package org.elasticsearch.gradle.precommit
import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin
+import de.thetaphi.forbiddenapis.gradle.CheckForbiddenApis
+import de.thetaphi.forbiddenapis.gradle.ForbiddenApisPlugin
import org.elasticsearch.gradle.ExportElasticsearchBuildResourcesTask
+import org.gradle.api.JavaVersion
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.plugins.JavaBasePlugin
@@ -33,7 +36,7 @@ class PrecommitTasks {
public static Task create(Project project, boolean includeDependencyLicenses) {
project.configurations.create("forbiddenApisCliJar")
project.dependencies {
- forbiddenApisCliJar ('de.thetaphi:forbiddenapis:2.5')
+ forbiddenApisCliJar ('de.thetaphi:forbiddenapis:2.6')
}
List precommitTasks = [
@@ -109,47 +112,43 @@ class PrecommitTasks {
}
private static Task configureForbiddenApisCli(Project project) {
- Task forbiddenApisCli = project.tasks.create('forbiddenApis')
- project.sourceSets.all { sourceSet ->
- forbiddenApisCli.dependsOn(
- project.tasks.create(sourceSet.getTaskName('forbiddenApis', null), ForbiddenApisCliTask) {
- ExportElasticsearchBuildResourcesTask buildResources = project.tasks.getByName('buildResources')
- dependsOn(buildResources)
- it.sourceSet = sourceSet
- javaHome = project.runtimeJavaHome
- targetCompatibility = project.compilerJavaVersion
- bundledSignatures = [
- "jdk-unsafe", "jdk-deprecated", "jdk-non-portable", "jdk-system-out"
- ]
- signaturesFiles = project.files(
- buildResources.copy("forbidden/jdk-signatures.txt"),
- buildResources.copy("forbidden/es-all-signatures.txt")
- )
- suppressAnnotations = ['**.SuppressForbidden']
- if (sourceSet.name == 'test') {
- signaturesFiles += project.files(
- buildResources.copy("forbidden/es-test-signatures.txt"),
- buildResources.copy("forbidden/http-signatures.txt")
- )
- } else {
- signaturesFiles += project.files(buildResources.copy("forbidden/es-server-signatures.txt"))
- }
- dependsOn sourceSet.classesTaskName
- classesDirs = sourceSet.output.classesDirs
- ext.replaceSignatureFiles = { String... names ->
- signaturesFiles = project.files(
- names.collect { buildResources.copy("forbidden/${it}.txt") }
- )
- }
- ext.addSignatureFiles = { String... names ->
- signaturesFiles += project.files(
- names.collect { buildResources.copy("forbidden/${it}.txt") }
- )
- }
- }
+ project.pluginManager.apply(ForbiddenApisPlugin)
+ ExportElasticsearchBuildResourcesTask buildResources = project.tasks.getByName('buildResources')
+ project.tasks.withType(CheckForbiddenApis) {
+ dependsOn(buildResources)
+ targetCompatibility = project.runtimeJavaVersion >= JavaVersion.VERSION_1_9 ?
+ project.runtimeJavaVersion.getMajorVersion() :
+ project.runtimeJavaVersion
+ bundledSignatures = [
+ "jdk-unsafe", "jdk-deprecated", "jdk-non-portable", "jdk-system-out"
+ ]
+ signaturesFiles = project.files(
+ buildResources.copy("forbidden/jdk-signatures.txt"),
+ buildResources.copy("forbidden/es-all-signatures.txt")
)
+ suppressAnnotations = ['**.SuppressForbidden']
+ if (name.endsWith('Test')) {
+ signaturesFiles += project.files(
+ buildResources.copy("forbidden/es-test-signatures.txt"),
+ buildResources.copy("forbidden/http-signatures.txt")
+ )
+ } else {
+ signaturesFiles += project.files(buildResources.copy("forbidden/es-server-signatures.txt"))
+ }
+ ext.replaceSignatureFiles = { String... names ->
+ signaturesFiles = project.files(
+ names.collect { buildResources.copy("forbidden/${it}.txt") }
+ )
+ }
+ ext.addSignatureFiles = { String... names ->
+ signaturesFiles += project.files(
+ names.collect { buildResources.copy("forbidden/${it}.txt") }
+ )
+ }
}
- return forbiddenApisCli
+ Task forbiddenApis = project.tasks.getByName("forbiddenApis")
+ forbiddenApis.group = ""
+ return forbiddenApis
}
private static Task configureCheckstyle(Project project) {
diff --git a/buildSrc/src/main/java/org/elasticsearch/gradle/precommit/ForbiddenApisCliTask.java b/buildSrc/src/main/java/org/elasticsearch/gradle/precommit/ForbiddenApisCliTask.java
deleted file mode 100644
index f88fff24be5..00000000000
--- a/buildSrc/src/main/java/org/elasticsearch/gradle/precommit/ForbiddenApisCliTask.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Licensed to Elasticsearch under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch licenses this file to you 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.
- */
-package org.elasticsearch.gradle.precommit;
-
-import org.elasticsearch.gradle.LoggedExec;
-import org.gradle.api.JavaVersion;
-import org.gradle.api.artifacts.Configuration;
-import org.gradle.api.file.FileCollection;
-import org.gradle.api.logging.Logger;
-import org.gradle.api.logging.Logging;
-import org.gradle.api.tasks.Input;
-import org.gradle.api.tasks.InputFiles;
-import org.gradle.api.tasks.SkipWhenEmpty;
-import org.gradle.api.tasks.SourceSet;
-import org.gradle.api.tasks.TaskAction;
-import org.gradle.process.JavaExecSpec;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
-public class ForbiddenApisCliTask extends PrecommitTask {
-
- private final Logger logger = Logging.getLogger(ForbiddenApisCliTask.class);
- private FileCollection signaturesFiles;
- private List signatures = new ArrayList<>();
- private Set bundledSignatures = new LinkedHashSet<>();
- private Set suppressAnnotations = new LinkedHashSet<>();
- private JavaVersion targetCompatibility;
- private FileCollection classesDirs;
- private SourceSet sourceSet;
- // This needs to be an object so it can hold Groovy GStrings
- private Object javaHome;
-
- @Input
- public JavaVersion getTargetCompatibility() {
- return targetCompatibility;
- }
-
- public void setTargetCompatibility(JavaVersion targetCompatibility) {
- if (targetCompatibility.compareTo(JavaVersion.VERSION_1_10) > 0) {
- logger.warn(
- "Target compatibility is set to {} but forbiddenapis only supports up to 10. Will cap at 10.",
- targetCompatibility
- );
- this.targetCompatibility = JavaVersion.VERSION_1_10;
- } else {
- this.targetCompatibility = targetCompatibility;
- }
- }
-
- @InputFiles
- @SkipWhenEmpty
- public FileCollection getClassesDirs() {
- return classesDirs.filter(File::exists);
- }
-
- public void setClassesDirs(FileCollection classesDirs) {
- this.classesDirs = classesDirs;
- }
-
- @InputFiles
- public FileCollection getSignaturesFiles() {
- return signaturesFiles;
- }
-
- public void setSignaturesFiles(FileCollection signaturesFiles) {
- this.signaturesFiles = signaturesFiles;
- }
-
- @Input
- public List getSignatures() {
- return signatures;
- }
-
- public void setSignatures(List signatures) {
- this.signatures = signatures;
- }
-
- @Input
- public Set getBundledSignatures() {
- return bundledSignatures;
- }
-
- public void setBundledSignatures(Set bundledSignatures) {
- this.bundledSignatures = bundledSignatures;
- }
-
- @Input
- public Set getSuppressAnnotations() {
- return suppressAnnotations;
- }
-
- public void setSuppressAnnotations(Set suppressAnnotations) {
- this.suppressAnnotations = suppressAnnotations;
- }
-
- @InputFiles
- public FileCollection getClassPathFromSourceSet() {
- return getProject().files(
- sourceSet.getCompileClasspath(),
- sourceSet.getRuntimeClasspath()
- );
- }
-
- public void setSourceSet(SourceSet sourceSet) {
- this.sourceSet = sourceSet;
- }
-
- @InputFiles
- public Configuration getForbiddenAPIsConfiguration() {
- return getProject().getConfigurations().getByName("forbiddenApisCliJar");
- }
-
- @Input
- public Object getJavaHome() {
- return javaHome;
- }
-
- public void setJavaHome(Object javaHome) {
- this.javaHome = javaHome;
- }
-
- @TaskAction
- public void runForbiddenApisAndWriteMarker() {
- LoggedExec.javaexec(getProject(), (JavaExecSpec spec) -> {
- spec.classpath(
- getForbiddenAPIsConfiguration(),
- getClassPathFromSourceSet()
- );
- spec.setExecutable(getJavaHome() + "/bin/java");
- spec.setMain("de.thetaphi.forbiddenapis.cli.CliMain");
- // build the command line
- getSignaturesFiles().forEach(file -> spec.args("-f", file.getAbsolutePath()));
- getSuppressAnnotations().forEach(annotation -> spec.args("--suppressannotation", annotation));
- getBundledSignatures().forEach(bundled -> {
- // there's no option for target compatibility so we have to interpret it
- final String prefix;
- if (bundled.equals("jdk-system-out") ||
- bundled.equals("jdk-reflection") ||
- bundled.equals("jdk-non-portable")) {
- prefix = "";
- } else {
- prefix = "-" + (
- getTargetCompatibility().compareTo(JavaVersion.VERSION_1_9) >= 0 ?
- getTargetCompatibility().getMajorVersion() :
- "1." + getTargetCompatibility().getMajorVersion())
- ;
- }
- spec.args("-b", bundled + prefix);
- }
- );
- getClassesDirs().forEach(dir ->
- spec.args("-d", dir)
- );
- });
- }
-
-}
diff --git a/buildSrc/src/main/java/org/elasticsearch/gradle/precommit/ThirdPartyAuditTask.java b/buildSrc/src/main/java/org/elasticsearch/gradle/precommit/ThirdPartyAuditTask.java
index bffa011cb7b..cd6326693ee 100644
--- a/buildSrc/src/main/java/org/elasticsearch/gradle/precommit/ThirdPartyAuditTask.java
+++ b/buildSrc/src/main/java/org/elasticsearch/gradle/precommit/ThirdPartyAuditTask.java
@@ -52,7 +52,7 @@ import java.util.stream.IntStream;
public class ThirdPartyAuditTask extends DefaultTask {
private static final Pattern MISSING_CLASS_PATTERN = Pattern.compile(
- "WARNING: The referenced class '(.*)' cannot be loaded\\. Please fix the classpath!"
+ "WARNING: Class '(.*)' cannot be loaded \\(.*\\)\\. Please fix the classpath!"
);
private static final Pattern VIOLATION_PATTERN = Pattern.compile(
diff --git a/client/rest/build.gradle b/client/rest/build.gradle
index 273836a31f0..f07ff4240ba 100644
--- a/client/rest/build.gradle
+++ b/client/rest/build.gradle
@@ -1,4 +1,4 @@
-import org.elasticsearch.gradle.precommit.ForbiddenApisCliTask
+import de.thetaphi.forbiddenapis.gradle.CheckForbiddenApis
/*
* Licensed to Elasticsearch under one or more contributor
@@ -52,7 +52,7 @@ dependencies {
testCompile "org.elasticsearch:mocksocket:${versions.mocksocket}"
}
-tasks.withType(ForbiddenApisCliTask) {
+tasks.withType(CheckForbiddenApis) {
//client does not depend on server, so only jdk and http signatures should be checked
replaceSignatureFiles ('jdk-signatures', 'http-signatures')
}
diff --git a/distribution/tools/launchers/build.gradle b/distribution/tools/launchers/build.gradle
index ca1aa6bcac9..f933c04278e 100644
--- a/distribution/tools/launchers/build.gradle
+++ b/distribution/tools/launchers/build.gradle
@@ -16,10 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-
-
-
-import org.elasticsearch.gradle.precommit.ForbiddenApisCliTask
+import de.thetaphi.forbiddenapis.gradle.CheckForbiddenApis
apply plugin: 'elasticsearch.build'
@@ -32,7 +29,7 @@ dependencies {
archivesBaseName = 'elasticsearch-launchers'
-tasks.withType(ForbiddenApisCliTask) {
+tasks.withType(CheckForbiddenApis) {
replaceSignatureFiles 'jdk-signatures'
}
diff --git a/libs/core/build.gradle b/libs/core/build.gradle
index 9c90837bd80..50b1b88bc61 100644
--- a/libs/core/build.gradle
+++ b/libs/core/build.gradle
@@ -48,8 +48,7 @@ if (!isEclipse && !isIdea) {
forbiddenApisJava9 {
if (project.runtimeJavaVersion < JavaVersion.VERSION_1_9) {
- targetCompatibility = JavaVersion.VERSION_1_9
- javaHome = project.java9Home
+ targetCompatibility = JavaVersion.VERSION_1_9.getMajorVersion()
}
replaceSignatureFiles 'jdk-signatures'
}
diff --git a/plugins/analysis-icu/build.gradle b/plugins/analysis-icu/build.gradle
index a42a28cad4e..315dcc5f6cb 100644
--- a/plugins/analysis-icu/build.gradle
+++ b/plugins/analysis-icu/build.gradle
@@ -1,4 +1,4 @@
-import org.elasticsearch.gradle.precommit.ForbiddenApisCliTask
+import de.thetaphi.forbiddenapis.gradle.CheckForbiddenApis
/*
* Licensed to Elasticsearch under one or more contributor
@@ -25,7 +25,7 @@ esplugin {
hasClientJar = true
}
-tasks.withType(ForbiddenApisCliTask) {
+tasks.withType(CheckForbiddenApis) {
signatures += [
"com.ibm.icu.text.Collator#getInstance() @ Don't use default locale, use getInstance(ULocale) instead"
]
diff --git a/server/build.gradle b/server/build.gradle
index c01fb92b050..85c7f45cf7e 100644
--- a/server/build.gradle
+++ b/server/build.gradle
@@ -61,8 +61,7 @@ if (!isEclipse && !isIdea) {
forbiddenApisJava9 {
if (project.runtimeJavaVersion < JavaVersion.VERSION_1_9) {
- targetCompatibility = JavaVersion.VERSION_1_9
- javaHome = project.java9Home
+ targetCompatibility = JavaVersion.VERSION_1_9.getMajorVersion()
}
}
diff --git a/x-pack/plugin/security/cli/build.gradle b/x-pack/plugin/security/cli/build.gradle
index 377d10ec7f2..9c76f1758a3 100644
--- a/x-pack/plugin/security/cli/build.gradle
+++ b/x-pack/plugin/security/cli/build.gradle
@@ -1,4 +1,4 @@
-import org.elasticsearch.gradle.precommit.ForbiddenApisCliTask
+import de.thetaphi.forbiddenapis.gradle.CheckForbiddenApis
apply plugin: 'elasticsearch.build'
@@ -26,7 +26,7 @@ if (project.inFipsJvm) {
test.enabled = false
// Forbiden APIs non-portable checks fail because bouncy castle classes being used from the FIPS JDK since those are
// not part of the Java specification - all of this is as designed, so we have to relax this check for FIPS.
- tasks.withType(ForbiddenApisCliTask) {
+ tasks.withType(CheckForbiddenApis) {
bundledSignatures -= "jdk-non-portable"
}
// FIPS JVM includes manny classes from bouncycastle which count as jar hell for the third party audit,
diff --git a/x-pack/plugin/sql/sql-cli/build.gradle b/x-pack/plugin/sql/sql-cli/build.gradle
index 0b2559c6a84..f0022040b49 100644
--- a/x-pack/plugin/sql/sql-cli/build.gradle
+++ b/x-pack/plugin/sql/sql-cli/build.gradle
@@ -1,4 +1,4 @@
-import org.elasticsearch.gradle.precommit.ForbiddenApisCliTask
+import de.thetaphi.forbiddenapis.gradle.CheckForbiddenApis
/*
* This project is named sql-cli because it is in the "org.elasticsearch.plugin"
@@ -75,7 +75,7 @@ artifacts {
}
-tasks.withType(ForbiddenApisCliTask) {
+tasks.withType(CheckForbiddenApis) {
signaturesFiles += files('src/forbidden/cli-signatures.txt')
}
From 1eb76f16b1ec9a635e79d135c8a21e39126db765 Mon Sep 17 00:00:00 2001
From: Marios Trivyzas
Date: Tue, 23 Oct 2018 11:11:22 +0200
Subject: [PATCH 03/24] SQL: Allow min/max aggregates on date fields (#34699)
Allow `MIN()` and `MAX()` aggregate functions to operate
also on arguments of type DATE apart from the numeric ones.
Fixes: #34477
---
.../xpack/sql/expression/Expressions.java | 23 +++++++++++--------
.../expression/function/aggregate/Max.java | 9 +++++++-
.../expression/function/aggregate/Min.java | 9 +++++++-
.../analyzer/VerifierErrorMessagesTests.java | 7 +++++-
x-pack/qa/sql/src/main/resources/agg.sql-spec | 4 ++++
5 files changed, 40 insertions(+), 12 deletions(-)
diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Expressions.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Expressions.java
index dfaef60abd5..c95e08f087d 100644
--- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Expressions.java
+++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Expressions.java
@@ -8,6 +8,7 @@ package org.elasticsearch.xpack.sql.expression;
import org.elasticsearch.xpack.sql.SqlIllegalArgumentException;
import org.elasticsearch.xpack.sql.expression.Expression.TypeResolution;
import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe;
+import org.elasticsearch.xpack.sql.type.DataType;
import java.util.ArrayList;
import java.util.Collection;
@@ -16,15 +17,10 @@ import java.util.function.Predicate;
import static java.util.Collections.emptyList;
import static java.util.Collections.emptyMap;
-import static java.util.stream.Collectors.toList;
-public abstract class Expressions {
+public final class Expressions {
- public static List asNamed(List extends Expression> exp) {
- return exp.stream()
- .map(NamedExpression.class::cast)
- .collect(toList());
- }
+ private Expressions() {}
public static NamedExpression wrapAsNamed(Expression exp) {
return exp instanceof NamedExpression ? (NamedExpression) exp : new Alias(exp.location(), exp.nodeName(), exp);
@@ -126,7 +122,16 @@ public abstract class Expressions {
}
public static TypeResolution typeMustBeNumeric(Expression e) {
- return e.dataType().isNumeric()? TypeResolution.TYPE_RESOLVED : new TypeResolution(
- "Argument required to be numeric ('" + Expressions.name(e) + "' of type '" + e.dataType().esType + "')");
+ return e.dataType().isNumeric() ? TypeResolution.TYPE_RESOLVED : new TypeResolution(numericErrorMessage(e));
+ }
+
+ public static TypeResolution typeMustBeNumericOrDate(Expression e) {
+ return e.dataType().isNumeric() || e.dataType() == DataType.DATE ?
+ TypeResolution.TYPE_RESOLVED :
+ new TypeResolution(numericErrorMessage(e));
+ }
+
+ private static String numericErrorMessage(Expression e) {
+ return "Argument required to be numeric ('" + Expressions.name(e) + "' of type '" + e.dataType().esType + "')";
}
}
diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/aggregate/Max.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/aggregate/Max.java
index 6b710cf06d5..fde06f239cb 100644
--- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/aggregate/Max.java
+++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/aggregate/Max.java
@@ -5,12 +5,14 @@
*/
package org.elasticsearch.xpack.sql.expression.function.aggregate;
-import java.util.List;
import org.elasticsearch.xpack.sql.expression.Expression;
+import org.elasticsearch.xpack.sql.expression.Expressions;
import org.elasticsearch.xpack.sql.tree.Location;
import org.elasticsearch.xpack.sql.tree.NodeInfo;
import org.elasticsearch.xpack.sql.type.DataType;
+import java.util.List;
+
/**
* Find the maximum value in matching documents.
*/
@@ -39,4 +41,9 @@ public class Max extends NumericAggregate implements EnclosedAgg {
public String innerName() {
return "max";
}
+
+ @Override
+ protected TypeResolution resolveType() {
+ return Expressions.typeMustBeNumericOrDate(field());
+ }
}
diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/aggregate/Min.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/aggregate/Min.java
index 16adf6461e1..42109aaf5d6 100644
--- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/aggregate/Min.java
+++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/aggregate/Min.java
@@ -5,12 +5,14 @@
*/
package org.elasticsearch.xpack.sql.expression.function.aggregate;
-import java.util.List;
import org.elasticsearch.xpack.sql.expression.Expression;
+import org.elasticsearch.xpack.sql.expression.Expressions;
import org.elasticsearch.xpack.sql.tree.Location;
import org.elasticsearch.xpack.sql.tree.NodeInfo;
import org.elasticsearch.xpack.sql.type.DataType;
+import java.util.List;
+
/**
* Find the minimum value in matched documents.
*/
@@ -42,4 +44,9 @@ public class Min extends NumericAggregate implements EnclosedAgg {
public String innerName() {
return "min";
}
+
+ @Override
+ protected TypeResolution resolveType() {
+ return Expressions.typeMustBeNumericOrDate(field());
+ }
}
diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/analysis/analyzer/VerifierErrorMessagesTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/analysis/analyzer/VerifierErrorMessagesTests.java
index 95949070f2e..05e88cfb66b 100644
--- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/analysis/analyzer/VerifierErrorMessagesTests.java
+++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/analysis/analyzer/VerifierErrorMessagesTests.java
@@ -125,6 +125,11 @@ public class VerifierErrorMessagesTests extends ESTestCase {
verify("SELECT AVG(int) FROM test GROUP BY AVG(int)"));
}
+ public void testNotSupportedAggregateOnDate() {
+ assertEquals("1:8: Argument required to be numeric ('date' of type 'date')",
+ verify("SELECT AVG(date) FROM test"));
+ }
+
public void testGroupByOnNested() {
assertEquals("1:38: Grouping isn't (yet) compatible with nested fields [dep.dep_id]",
verify("SELECT dep.dep_id FROM test GROUP BY dep.dep_id"));
@@ -169,4 +174,4 @@ public class VerifierErrorMessagesTests extends ESTestCase {
assertEquals("1:42: Cannot filter HAVING on non-aggregate [int]; consider using WHERE instead",
verify("SELECT int FROM test GROUP BY int HAVING 2 < ABS(int)"));
}
-}
\ No newline at end of file
+}
diff --git a/x-pack/qa/sql/src/main/resources/agg.sql-spec b/x-pack/qa/sql/src/main/resources/agg.sql-spec
index c97f4da0fbc..daf97ebd787 100644
--- a/x-pack/qa/sql/src/main/resources/agg.sql-spec
+++ b/x-pack/qa/sql/src/main/resources/agg.sql-spec
@@ -216,6 +216,8 @@ aggMinWithCastAndFilter
SELECT gender g, CAST(MIN(emp_no) AS SMALLINT) m, COUNT(1) c FROM "test_emp" WHERE emp_no < 10020 GROUP BY gender ORDER BY gender;
aggMinWithAlias
SELECT gender g, MIN(emp_no) m FROM "test_emp" GROUP BY g ORDER BY gender;
+aggMinOnDate
+SELECT gender, MIN(birth_date) m FROM "test_emp" GROUP BY gender ORDER BY gender;
// Conditional MIN
aggMinWithHaving
@@ -270,6 +272,8 @@ aggMaxAndCountWithFilterAndLimit
SELECT gender g, MAX(emp_no) m, COUNT(1) c FROM "test_emp" WHERE emp_no > 10000 GROUP BY gender ORDER BY gender LIMIT 1;
aggMaxWithAlias
SELECT gender g, MAX(emp_no) m FROM "test_emp" GROUP BY g ORDER BY gender;
+aggMaxOnDate
+SELECT gender, MAX(birth_date) m FROM "test_emp" GROUP BY gender ORDER BY gender;
// Conditional MAX
aggMaxWithHaving
From 5fb4f32c9101a0ac9ec4e6e40c693501f75c3aca Mon Sep 17 00:00:00 2001
From: Alpar Torok
Date: Tue, 23 Oct 2018 12:13:49 +0300
Subject: [PATCH 04/24] [Build] Simplify testclusters configuration (#34334)
Remove interface, prefer straught implementaton instead.
---
.../ElasticsearchConfiguration.java | 46 -------------------
.../testclusters/ElasticsearchNode.java | 10 +---
.../testclusters/TestClustersPlugin.java | 14 +++---
3 files changed, 8 insertions(+), 62 deletions(-)
delete mode 100644 buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/ElasticsearchConfiguration.java
diff --git a/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/ElasticsearchConfiguration.java b/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/ElasticsearchConfiguration.java
deleted file mode 100644
index a200c75880e..00000000000
--- a/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/ElasticsearchConfiguration.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to Elasticsearch under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch licenses this file to you 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.
- */
-package org.elasticsearch.gradle.testclusters;
-
-import org.elasticsearch.gradle.Distribution;
-import org.elasticsearch.gradle.Version;
-
-import java.util.concurrent.Future;
-
-public interface ElasticsearchConfiguration {
- String getName();
-
- Version getVersion();
-
- void setVersion(Version version);
-
- default void setVersion(String version) {
- setVersion(Version.fromString(version));
- }
-
- Distribution getDistribution();
-
- void setDistribution(Distribution distribution);
-
- void claim();
-
- Future start();
-
- void unClaimAndStop();
-}
diff --git a/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/ElasticsearchNode.java b/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/ElasticsearchNode.java
index a196cb09e97..85931c7846b 100644
--- a/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/ElasticsearchNode.java
+++ b/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/ElasticsearchNode.java
@@ -29,7 +29,7 @@ import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
-public class ElasticsearchNode implements ElasticsearchConfiguration {
+public class ElasticsearchNode {
private final String name;
private final GradleServicesAdapter services;
@@ -45,34 +45,28 @@ public class ElasticsearchNode implements ElasticsearchConfiguration {
this.services = services;
}
- @Override
public String getName() {
return name;
}
- @Override
public Version getVersion() {
return version;
}
- @Override
public void setVersion(Version version) {
checkNotRunning();
this.version = version;
}
- @Override
public Distribution getDistribution() {
return distribution;
}
- @Override
public void setDistribution(Distribution distribution) {
checkNotRunning();
this.distribution = distribution;
}
- @Override
public void claim() {
noOfClaims.incrementAndGet();
}
@@ -82,7 +76,6 @@ public class ElasticsearchNode implements ElasticsearchConfiguration {
*
* @return future of thread running in the background
*/
- @Override
public Future start() {
if (started.getAndSet(true)) {
logger.lifecycle("Already started cluster: {}", name);
@@ -95,7 +88,6 @@ public class ElasticsearchNode implements ElasticsearchConfiguration {
/**
* Stops a running cluster if it's not claimed. Does nothing otherwise.
*/
- @Override
public void unClaimAndStop() {
int decrementedClaims = noOfClaims.decrementAndGet();
if (decrementedClaims > 0) {
diff --git a/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/TestClustersPlugin.java b/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/TestClustersPlugin.java
index 3a137906bec..73aad33b8ea 100644
--- a/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/TestClustersPlugin.java
+++ b/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/TestClustersPlugin.java
@@ -46,7 +46,7 @@ public class TestClustersPlugin implements Plugin {
@Override
public void apply(Project project) {
- NamedDomainObjectContainer extends ElasticsearchConfiguration> container = project.container(
+ NamedDomainObjectContainer extends ElasticsearchNode> container = project.container(
ElasticsearchNode.class,
(name) -> new ElasticsearchNode(name, GradleServicesAdapter.getInstance(project))
);
@@ -56,12 +56,12 @@ public class TestClustersPlugin implements Plugin {
listTask.setGroup("ES cluster formation");
listTask.setDescription("Lists all ES clusters configured for this project");
listTask.doLast((Task task) ->
- container.forEach((ElasticsearchConfiguration cluster) ->
+ container.forEach((ElasticsearchNode cluster) ->
logger.lifecycle(" * {}: {}", cluster.getName(), cluster.getDistribution())
)
);
- Map> taskToCluster = new HashMap<>();
+ Map> taskToCluster = new HashMap<>();
// register an extension for all current and future tasks, so that any task can declare that it wants to use a
// specific cluster.
@@ -70,7 +70,7 @@ public class TestClustersPlugin implements Plugin {
.set(
"useCluster",
new Closure(this, this) {
- public void doCall(ElasticsearchConfiguration conf) {
+ public void doCall(ElasticsearchNode conf) {
taskToCluster.computeIfAbsent(task, k -> new ArrayList<>()).add(conf);
}
})
@@ -79,7 +79,7 @@ public class TestClustersPlugin implements Plugin {
project.getGradle().getTaskGraph().whenReady(taskExecutionGraph ->
taskExecutionGraph.getAllTasks()
.forEach(task ->
- taskToCluster.getOrDefault(task, Collections.emptyList()).forEach(ElasticsearchConfiguration::claim)
+ taskToCluster.getOrDefault(task, Collections.emptyList()).forEach(ElasticsearchNode::claim)
)
);
project.getGradle().addListener(
@@ -87,7 +87,7 @@ public class TestClustersPlugin implements Plugin {
@Override
public void beforeActions(Task task) {
// we only start the cluster before the actions, so we'll not start it if the task is up-to-date
- taskToCluster.getOrDefault(task, new ArrayList<>()).forEach(ElasticsearchConfiguration::start);
+ taskToCluster.getOrDefault(task, new ArrayList<>()).forEach(ElasticsearchNode::start);
}
@Override
public void afterActions(Task task) {}
@@ -99,7 +99,7 @@ public class TestClustersPlugin implements Plugin {
public void afterExecute(Task task, TaskState state) {
// always un-claim the cluster, even if _this_ task is up-to-date, as others might not have been and caused the
// cluster to start.
- taskToCluster.getOrDefault(task, new ArrayList<>()).forEach(ElasticsearchConfiguration::unClaimAndStop);
+ taskToCluster.getOrDefault(task, new ArrayList<>()).forEach(ElasticsearchNode::unClaimAndStop);
}
@Override
public void beforeExecute(Task task) {}
From e9e140790a5279f0a00f75c036acf9ab6ae91eb7 Mon Sep 17 00:00:00 2001
From: Marios Trivyzas
Date: Tue, 23 Oct 2018 11:21:15 +0200
Subject: [PATCH 05/24] SQL: Implement `CONVERT`, an alternative to `CAST`
(#34660)
`CONVERT` works exactly like cast with slightly different syntax:
`CONVERT(, AS )`
Moreover it support format of the MS-SQL data types `SQL_`,
e.g.: `SQL_INTEGER`
Closes: #34513
---
.../sql/functions/type-conversion.asciidoc | 33 +-
.../xpack/sql/type/DataType.java | 57 +-
x-pack/plugin/sql/src/main/antlr/SqlBase.g4 | 13 +-
.../plugin/sql/src/main/antlr/SqlBase.tokens | 342 ++--
.../sql/src/main/antlr/SqlBaseLexer.tokens | 340 ++--
.../xpack/sql/parser/ExpressionBuilder.java | 24 +-
.../xpack/sql/parser/SqlBaseBaseListener.java | 12 +
.../xpack/sql/parser/SqlBaseBaseVisitor.java | 7 +
.../xpack/sql/parser/SqlBaseLexer.java | 675 +++----
.../xpack/sql/parser/SqlBaseListener.java | 10 +
.../xpack/sql/parser/SqlBaseParser.java | 1733 +++++++++--------
.../xpack/sql/parser/SqlBaseVisitor.java | 6 +
.../xpack/sql/parser/ExpressionTests.java | 86 +
.../sql/type/DataTypeConversionTests.java | 6 +
.../qa/sql/src/main/resources/docs.csv-spec | 27 +
15 files changed, 1865 insertions(+), 1506 deletions(-)
diff --git a/docs/reference/sql/functions/type-conversion.asciidoc b/docs/reference/sql/functions/type-conversion.asciidoc
index 549b05d69d8..7075e7f2846 100644
--- a/docs/reference/sql/functions/type-conversion.asciidoc
+++ b/docs/reference/sql/functions/type-conversion.asciidoc
@@ -19,7 +19,7 @@ CAST ( expression<1> AS data_type<2> )
.Description
-Casts the result of the given expression to the target type.
+Casts the result of the given expression to the target <>.
If the cast is not possible (for example because of target type is too narrow or because
the value itself cannot be converted), the query fails.
@@ -36,4 +36,33 @@ include-tagged::{sql-specs}/docs.csv-spec[conversionIntToStringCast]
["source","sql",subs="attributes,callouts,macros"]
----
include-tagged::{sql-specs}/docs.csv-spec[conversionStringToDateCast]
-----
\ No newline at end of file
+----
+
+
+[[sql-functions-type-conversion-convert]]
+==== `CONVERT`
+
+.Synopsis
+[source, sql]
+----
+CONVERT ( expression<1>, data_type<2> )
+----
+
+<1> Expression to convert
+<2> Target data type to convert to
+
+.Description
+
+Works exactly like <> with slightly different syntax.
+Moreover, apart from the standard <> it supports the corresponding
+https://docs.microsoft.com/en-us/sql/odbc/reference/appendixes/explicit-data-type-conversion-function?view=sql-server-2017[ODBC data types].
+
+["source","sql",subs="attributes,callouts,macros"]
+----
+include-tagged::{sql-specs}/docs.csv-spec[conversionStringToIntConvertODBCDataType]
+----
+
+["source","sql",subs="attributes,callouts,macros"]
+----
+include-tagged::{sql-specs}/docs.csv-spec[conversionStringToIntConvertESDataType]
+----
diff --git a/x-pack/plugin/sql/sql-proto/src/main/java/org/elasticsearch/xpack/sql/type/DataType.java b/x-pack/plugin/sql/sql-proto/src/main/java/org/elasticsearch/xpack/sql/type/DataType.java
index 05fb192f8d1..4087a81a424 100644
--- a/x-pack/plugin/sql/sql-proto/src/main/java/org/elasticsearch/xpack/sql/type/DataType.java
+++ b/x-pack/plugin/sql/sql-proto/src/main/java/org/elasticsearch/xpack/sql/type/DataType.java
@@ -9,6 +9,7 @@ import java.sql.JDBCType;
import java.sql.SQLType;
import java.sql.Timestamp;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.stream.Collectors;
@@ -44,12 +45,63 @@ public enum DataType {
DATE( JDBCType.TIMESTAMP, Timestamp.class, Long.BYTES, 24, 24);
// @formatter:on
+ public static final String ODBC_DATATYPE_PREFIX = "SQL_";
+
private static final Map jdbcToEs;
+ private static final Map odbcToEs;
static {
jdbcToEs = Arrays.stream(DataType.values())
.filter(dataType -> dataType != TEXT && dataType != NESTED && dataType != SCALED_FLOAT) // Remove duplicates
.collect(Collectors.toMap(dataType -> dataType.jdbcType, dataType -> dataType));
+
+ odbcToEs = new HashMap<>(36);
+
+ // Numeric
+ odbcToEs.put("SQL_BIT", BOOLEAN);
+ odbcToEs.put("SQL_TINYINT", BYTE);
+ odbcToEs.put("SQL_SMALLINT", SHORT);
+ odbcToEs.put("SQL_INTEGER", INTEGER);
+ odbcToEs.put("SQL_BIGINT", LONG);
+ odbcToEs.put("SQL_FLOAT", FLOAT);
+ odbcToEs.put("SQL_REAL", FLOAT);
+ odbcToEs.put("SQL_DOUBLE", DOUBLE);
+ odbcToEs.put("SQL_DECIMAL", DOUBLE);
+ odbcToEs.put("SQL_NUMERIC", DOUBLE);
+
+ // String
+ odbcToEs.put("SQL_GUID", KEYWORD);
+ odbcToEs.put("SQL_CHAR", KEYWORD);
+ odbcToEs.put("SQL_WCHAR", KEYWORD);
+ odbcToEs.put("SQL_VARCHAR", TEXT);
+ odbcToEs.put("SQL_WVARCHAR", TEXT);
+ odbcToEs.put("SQL_LONGVARCHAR", TEXT);
+ odbcToEs.put("SQL_WLONGVARCHAR", TEXT);
+
+ // Binary
+ odbcToEs.put("SQL_BINARY", BINARY);
+ odbcToEs.put("SQL_VARBINARY", BINARY);
+ odbcToEs.put("SQL_LONGVARBINARY", BINARY);
+
+ // Date
+ odbcToEs.put("SQL_DATE", DATE);
+ odbcToEs.put("SQL_TIME", DATE);
+ odbcToEs.put("SQL_TIMESTAMP", DATE);
+
+ // Intervals - Currently Not Supported
+ odbcToEs.put("SQL_INTERVAL_HOUR_TO_MINUTE", UNSUPPORTED);
+ odbcToEs.put("SQL_INTERVAL_HOUR_TO_SECOND", UNSUPPORTED);
+ odbcToEs.put("SQL_INTERVAL_MINUTE_TO_SECOND", UNSUPPORTED);
+ odbcToEs.put("SQL_INTERVAL_MONTH", UNSUPPORTED);
+ odbcToEs.put("SQL_INTERVAL_YEAR", UNSUPPORTED);
+ odbcToEs.put("SQL_INTERVAL_YEAR_TO_MONTH", UNSUPPORTED);
+ odbcToEs.put("SQL_INTERVAL_DAY", UNSUPPORTED);
+ odbcToEs.put("SQL_INTERVAL_HOUR", UNSUPPORTED);
+ odbcToEs.put("SQL_INTERVAL_MINUTE", UNSUPPORTED);
+ odbcToEs.put("SQL_INTERVAL_SECOND", UNSUPPORTED);
+ odbcToEs.put("SQL_INTERVAL_DAY_TO_HOUR", UNSUPPORTED);
+ odbcToEs.put("SQL_INTERVAL_DAY_TO_MINUTE", UNSUPPORTED);
+ odbcToEs.put("SQL_INTERVAL_DAY_TO_SECOND", UNSUPPORTED);
}
/**
@@ -162,6 +214,9 @@ public enum DataType {
return jdbcToEs.get(jdbcType).javaClass();
}
+ public static DataType fromODBCType(String odbcType) {
+ return odbcToEs.get(odbcType);
+ }
/**
* Creates returns DataType enum coresponding to the specified es type
*
@@ -170,4 +225,4 @@ public enum DataType {
public static DataType fromEsType(String esType) {
return DataType.valueOf(esType.toUpperCase(Locale.ROOT));
}
-}
\ No newline at end of file
+}
diff --git a/x-pack/plugin/sql/src/main/antlr/SqlBase.g4 b/x-pack/plugin/sql/src/main/antlr/SqlBase.g4
index 859cc26bf9c..1b3cbc04307 100644
--- a/x-pack/plugin/sql/src/main/antlr/SqlBase.g4
+++ b/x-pack/plugin/sql/src/main/antlr/SqlBase.g4
@@ -226,14 +226,20 @@ primaryExpression
;
castExpression
- : castTemplate
- | FUNCTION_ESC castTemplate ESC_END
+ : castTemplate
+ | FUNCTION_ESC castTemplate ESC_END
+ | convertTemplate
+ | FUNCTION_ESC convertTemplate ESC_END
;
castTemplate
: CAST '(' expression AS dataType ')'
;
-
+
+convertTemplate
+ : CONVERT '(' expression ',' dataType ')'
+ ;
+
extractExpression
: extractTemplate
| FUNCTION_ESC extractTemplate ESC_END
@@ -347,6 +353,7 @@ CAST: 'CAST';
CATALOG: 'CATALOG';
CATALOGS: 'CATALOGS';
COLUMNS: 'COLUMNS';
+CONVERT: 'CONVERT';
DEBUG: 'DEBUG';
DESC: 'DESC';
DESCRIBE: 'DESCRIBE';
diff --git a/x-pack/plugin/sql/src/main/antlr/SqlBase.tokens b/x-pack/plugin/sql/src/main/antlr/SqlBase.tokens
index 1a90fb72ef5..b422b510aa9 100644
--- a/x-pack/plugin/sql/src/main/antlr/SqlBase.tokens
+++ b/x-pack/plugin/sql/src/main/antlr/SqlBase.tokens
@@ -15,98 +15,99 @@ CAST=14
CATALOG=15
CATALOGS=16
COLUMNS=17
-DEBUG=18
-DESC=19
-DESCRIBE=20
-DISTINCT=21
-ESCAPE=22
-EXECUTABLE=23
-EXISTS=24
-EXPLAIN=25
-EXTRACT=26
-FALSE=27
-FIRST=28
-FORMAT=29
-FROM=30
-FULL=31
-FUNCTIONS=32
-GRAPHVIZ=33
-GROUP=34
-HAVING=35
-IN=36
-INNER=37
-IS=38
-JOIN=39
-LAST=40
-LEFT=41
-LIKE=42
-LIMIT=43
-MAPPED=44
-MATCH=45
-NATURAL=46
-NOT=47
-NULL=48
-NULLS=49
-ON=50
-OPTIMIZED=51
-OR=52
-ORDER=53
-OUTER=54
-PARSED=55
-PHYSICAL=56
-PLAN=57
-RIGHT=58
-RLIKE=59
-QUERY=60
-SCHEMAS=61
-SELECT=62
-SHOW=63
-SYS=64
-TABLE=65
-TABLES=66
-TEXT=67
-TRUE=68
-TYPE=69
-TYPES=70
-USING=71
-VERIFY=72
-WHERE=73
-WITH=74
-ESCAPE_ESC=75
-FUNCTION_ESC=76
-LIMIT_ESC=77
-DATE_ESC=78
-TIME_ESC=79
-TIMESTAMP_ESC=80
-GUID_ESC=81
-ESC_END=82
-EQ=83
-NEQ=84
-LT=85
-LTE=86
-GT=87
-GTE=88
-PLUS=89
-MINUS=90
-ASTERISK=91
-SLASH=92
-PERCENT=93
-CONCAT=94
-DOT=95
-PARAM=96
-STRING=97
-INTEGER_VALUE=98
-DECIMAL_VALUE=99
-IDENTIFIER=100
-DIGIT_IDENTIFIER=101
-TABLE_IDENTIFIER=102
-QUOTED_IDENTIFIER=103
-BACKQUOTED_IDENTIFIER=104
-SIMPLE_COMMENT=105
-BRACKETED_COMMENT=106
-WS=107
-UNRECOGNIZED=108
-DELIMITER=109
+CONVERT=18
+DEBUG=19
+DESC=20
+DESCRIBE=21
+DISTINCT=22
+ESCAPE=23
+EXECUTABLE=24
+EXISTS=25
+EXPLAIN=26
+EXTRACT=27
+FALSE=28
+FIRST=29
+FORMAT=30
+FROM=31
+FULL=32
+FUNCTIONS=33
+GRAPHVIZ=34
+GROUP=35
+HAVING=36
+IN=37
+INNER=38
+IS=39
+JOIN=40
+LAST=41
+LEFT=42
+LIKE=43
+LIMIT=44
+MAPPED=45
+MATCH=46
+NATURAL=47
+NOT=48
+NULL=49
+NULLS=50
+ON=51
+OPTIMIZED=52
+OR=53
+ORDER=54
+OUTER=55
+PARSED=56
+PHYSICAL=57
+PLAN=58
+RIGHT=59
+RLIKE=60
+QUERY=61
+SCHEMAS=62
+SELECT=63
+SHOW=64
+SYS=65
+TABLE=66
+TABLES=67
+TEXT=68
+TRUE=69
+TYPE=70
+TYPES=71
+USING=72
+VERIFY=73
+WHERE=74
+WITH=75
+ESCAPE_ESC=76
+FUNCTION_ESC=77
+LIMIT_ESC=78
+DATE_ESC=79
+TIME_ESC=80
+TIMESTAMP_ESC=81
+GUID_ESC=82
+ESC_END=83
+EQ=84
+NEQ=85
+LT=86
+LTE=87
+GT=88
+GTE=89
+PLUS=90
+MINUS=91
+ASTERISK=92
+SLASH=93
+PERCENT=94
+CONCAT=95
+DOT=96
+PARAM=97
+STRING=98
+INTEGER_VALUE=99
+DECIMAL_VALUE=100
+IDENTIFIER=101
+DIGIT_IDENTIFIER=102
+TABLE_IDENTIFIER=103
+QUOTED_IDENTIFIER=104
+BACKQUOTED_IDENTIFIER=105
+SIMPLE_COMMENT=106
+BRACKETED_COMMENT=107
+WS=108
+UNRECOGNIZED=109
+DELIMITER=110
'('=1
')'=2
','=3
@@ -124,81 +125,82 @@ DELIMITER=109
'CATALOG'=15
'CATALOGS'=16
'COLUMNS'=17
-'DEBUG'=18
-'DESC'=19
-'DESCRIBE'=20
-'DISTINCT'=21
-'ESCAPE'=22
-'EXECUTABLE'=23
-'EXISTS'=24
-'EXPLAIN'=25
-'EXTRACT'=26
-'FALSE'=27
-'FIRST'=28
-'FORMAT'=29
-'FROM'=30
-'FULL'=31
-'FUNCTIONS'=32
-'GRAPHVIZ'=33
-'GROUP'=34
-'HAVING'=35
-'IN'=36
-'INNER'=37
-'IS'=38
-'JOIN'=39
-'LAST'=40
-'LEFT'=41
-'LIKE'=42
-'LIMIT'=43
-'MAPPED'=44
-'MATCH'=45
-'NATURAL'=46
-'NOT'=47
-'NULL'=48
-'NULLS'=49
-'ON'=50
-'OPTIMIZED'=51
-'OR'=52
-'ORDER'=53
-'OUTER'=54
-'PARSED'=55
-'PHYSICAL'=56
-'PLAN'=57
-'RIGHT'=58
-'RLIKE'=59
-'QUERY'=60
-'SCHEMAS'=61
-'SELECT'=62
-'SHOW'=63
-'SYS'=64
-'TABLE'=65
-'TABLES'=66
-'TEXT'=67
-'TRUE'=68
-'TYPE'=69
-'TYPES'=70
-'USING'=71
-'VERIFY'=72
-'WHERE'=73
-'WITH'=74
-'{ESCAPE'=75
-'{FN'=76
-'{LIMIT'=77
-'{D'=78
-'{T'=79
-'{TS'=80
-'{GUID'=81
-'}'=82
-'='=83
-'<'=85
-'<='=86
-'>'=87
-'>='=88
-'+'=89
-'-'=90
-'*'=91
-'/'=92
-'%'=93
-'||'=94
-'.'=95
-'?'=96
+'CONVERT'=18
+'DEBUG'=19
+'DESC'=20
+'DESCRIBE'=21
+'DISTINCT'=22
+'ESCAPE'=23
+'EXECUTABLE'=24
+'EXISTS'=25
+'EXPLAIN'=26
+'EXTRACT'=27
+'FALSE'=28
+'FIRST'=29
+'FORMAT'=30
+'FROM'=31
+'FULL'=32
+'FUNCTIONS'=33
+'GRAPHVIZ'=34
+'GROUP'=35
+'HAVING'=36
+'IN'=37
+'INNER'=38
+'IS'=39
+'JOIN'=40
+'LAST'=41
+'LEFT'=42
+'LIKE'=43
+'LIMIT'=44
+'MAPPED'=45
+'MATCH'=46
+'NATURAL'=47
+'NOT'=48
+'NULL'=49
+'NULLS'=50
+'ON'=51
+'OPTIMIZED'=52
+'OR'=53
+'ORDER'=54
+'OUTER'=55
+'PARSED'=56
+'PHYSICAL'=57
+'PLAN'=58
+'RIGHT'=59
+'RLIKE'=60
+'QUERY'=61
+'SCHEMAS'=62
+'SELECT'=63
+'SHOW'=64
+'SYS'=65
+'TABLE'=66
+'TABLES'=67
+'TEXT'=68
+'TRUE'=69
+'TYPE'=70
+'TYPES'=71
+'USING'=72
+'VERIFY'=73
+'WHERE'=74
+'WITH'=75
+'{ESCAPE'=76
+'{FN'=77
+'{LIMIT'=78
+'{D'=79
+'{T'=80
+'{TS'=81
+'{GUID'=82
+'}'=83
+'='=84
+'<'=86
+'<='=87
+'>'=88
+'>='=89
+'+'=90
+'-'=91
+'*'=92
+'/'=93
+'%'=94
+'||'=95
+'.'=96
+'?'=97
diff --git a/x-pack/plugin/sql/src/main/antlr/SqlBaseLexer.tokens b/x-pack/plugin/sql/src/main/antlr/SqlBaseLexer.tokens
index b3ca016bb45..96ccf27d1f9 100644
--- a/x-pack/plugin/sql/src/main/antlr/SqlBaseLexer.tokens
+++ b/x-pack/plugin/sql/src/main/antlr/SqlBaseLexer.tokens
@@ -15,97 +15,98 @@ CAST=14
CATALOG=15
CATALOGS=16
COLUMNS=17
-DEBUG=18
-DESC=19
-DESCRIBE=20
-DISTINCT=21
-ESCAPE=22
-EXECUTABLE=23
-EXISTS=24
-EXPLAIN=25
-EXTRACT=26
-FALSE=27
-FIRST=28
-FORMAT=29
-FROM=30
-FULL=31
-FUNCTIONS=32
-GRAPHVIZ=33
-GROUP=34
-HAVING=35
-IN=36
-INNER=37
-IS=38
-JOIN=39
-LAST=40
-LEFT=41
-LIKE=42
-LIMIT=43
-MAPPED=44
-MATCH=45
-NATURAL=46
-NOT=47
-NULL=48
-NULLS=49
-ON=50
-OPTIMIZED=51
-OR=52
-ORDER=53
-OUTER=54
-PARSED=55
-PHYSICAL=56
-PLAN=57
-RIGHT=58
-RLIKE=59
-QUERY=60
-SCHEMAS=61
-SELECT=62
-SHOW=63
-SYS=64
-TABLE=65
-TABLES=66
-TEXT=67
-TRUE=68
-TYPE=69
-TYPES=70
-USING=71
-VERIFY=72
-WHERE=73
-WITH=74
-ESCAPE_ESC=75
-FUNCTION_ESC=76
-LIMIT_ESC=77
-DATE_ESC=78
-TIME_ESC=79
-TIMESTAMP_ESC=80
-GUID_ESC=81
-ESC_END=82
-EQ=83
-NEQ=84
-LT=85
-LTE=86
-GT=87
-GTE=88
-PLUS=89
-MINUS=90
-ASTERISK=91
-SLASH=92
-PERCENT=93
-CONCAT=94
-DOT=95
-PARAM=96
-STRING=97
-INTEGER_VALUE=98
-DECIMAL_VALUE=99
-IDENTIFIER=100
-DIGIT_IDENTIFIER=101
-TABLE_IDENTIFIER=102
-QUOTED_IDENTIFIER=103
-BACKQUOTED_IDENTIFIER=104
-SIMPLE_COMMENT=105
-BRACKETED_COMMENT=106
-WS=107
-UNRECOGNIZED=108
+CONVERT=18
+DEBUG=19
+DESC=20
+DESCRIBE=21
+DISTINCT=22
+ESCAPE=23
+EXECUTABLE=24
+EXISTS=25
+EXPLAIN=26
+EXTRACT=27
+FALSE=28
+FIRST=29
+FORMAT=30
+FROM=31
+FULL=32
+FUNCTIONS=33
+GRAPHVIZ=34
+GROUP=35
+HAVING=36
+IN=37
+INNER=38
+IS=39
+JOIN=40
+LAST=41
+LEFT=42
+LIKE=43
+LIMIT=44
+MAPPED=45
+MATCH=46
+NATURAL=47
+NOT=48
+NULL=49
+NULLS=50
+ON=51
+OPTIMIZED=52
+OR=53
+ORDER=54
+OUTER=55
+PARSED=56
+PHYSICAL=57
+PLAN=58
+RIGHT=59
+RLIKE=60
+QUERY=61
+SCHEMAS=62
+SELECT=63
+SHOW=64
+SYS=65
+TABLE=66
+TABLES=67
+TEXT=68
+TRUE=69
+TYPE=70
+TYPES=71
+USING=72
+VERIFY=73
+WHERE=74
+WITH=75
+ESCAPE_ESC=76
+FUNCTION_ESC=77
+LIMIT_ESC=78
+DATE_ESC=79
+TIME_ESC=80
+TIMESTAMP_ESC=81
+GUID_ESC=82
+ESC_END=83
+EQ=84
+NEQ=85
+LT=86
+LTE=87
+GT=88
+GTE=89
+PLUS=90
+MINUS=91
+ASTERISK=92
+SLASH=93
+PERCENT=94
+CONCAT=95
+DOT=96
+PARAM=97
+STRING=98
+INTEGER_VALUE=99
+DECIMAL_VALUE=100
+IDENTIFIER=101
+DIGIT_IDENTIFIER=102
+TABLE_IDENTIFIER=103
+QUOTED_IDENTIFIER=104
+BACKQUOTED_IDENTIFIER=105
+SIMPLE_COMMENT=106
+BRACKETED_COMMENT=107
+WS=108
+UNRECOGNIZED=109
'('=1
')'=2
','=3
@@ -123,81 +124,82 @@ UNRECOGNIZED=108
'CATALOG'=15
'CATALOGS'=16
'COLUMNS'=17
-'DEBUG'=18
-'DESC'=19
-'DESCRIBE'=20
-'DISTINCT'=21
-'ESCAPE'=22
-'EXECUTABLE'=23
-'EXISTS'=24
-'EXPLAIN'=25
-'EXTRACT'=26
-'FALSE'=27
-'FIRST'=28
-'FORMAT'=29
-'FROM'=30
-'FULL'=31
-'FUNCTIONS'=32
-'GRAPHVIZ'=33
-'GROUP'=34
-'HAVING'=35
-'IN'=36
-'INNER'=37
-'IS'=38
-'JOIN'=39
-'LAST'=40
-'LEFT'=41
-'LIKE'=42
-'LIMIT'=43
-'MAPPED'=44
-'MATCH'=45
-'NATURAL'=46
-'NOT'=47
-'NULL'=48
-'NULLS'=49
-'ON'=50
-'OPTIMIZED'=51
-'OR'=52
-'ORDER'=53
-'OUTER'=54
-'PARSED'=55
-'PHYSICAL'=56
-'PLAN'=57
-'RIGHT'=58
-'RLIKE'=59
-'QUERY'=60
-'SCHEMAS'=61
-'SELECT'=62
-'SHOW'=63
-'SYS'=64
-'TABLE'=65
-'TABLES'=66
-'TEXT'=67
-'TRUE'=68
-'TYPE'=69
-'TYPES'=70
-'USING'=71
-'VERIFY'=72
-'WHERE'=73
-'WITH'=74
-'{ESCAPE'=75
-'{FN'=76
-'{LIMIT'=77
-'{D'=78
-'{T'=79
-'{TS'=80
-'{GUID'=81
-'}'=82
-'='=83
-'<'=85
-'<='=86
-'>'=87
-'>='=88
-'+'=89
-'-'=90
-'*'=91
-'/'=92
-'%'=93
-'||'=94
-'.'=95
-'?'=96
+'CONVERT'=18
+'DEBUG'=19
+'DESC'=20
+'DESCRIBE'=21
+'DISTINCT'=22
+'ESCAPE'=23
+'EXECUTABLE'=24
+'EXISTS'=25
+'EXPLAIN'=26
+'EXTRACT'=27
+'FALSE'=28
+'FIRST'=29
+'FORMAT'=30
+'FROM'=31
+'FULL'=32
+'FUNCTIONS'=33
+'GRAPHVIZ'=34
+'GROUP'=35
+'HAVING'=36
+'IN'=37
+'INNER'=38
+'IS'=39
+'JOIN'=40
+'LAST'=41
+'LEFT'=42
+'LIKE'=43
+'LIMIT'=44
+'MAPPED'=45
+'MATCH'=46
+'NATURAL'=47
+'NOT'=48
+'NULL'=49
+'NULLS'=50
+'ON'=51
+'OPTIMIZED'=52
+'OR'=53
+'ORDER'=54
+'OUTER'=55
+'PARSED'=56
+'PHYSICAL'=57
+'PLAN'=58
+'RIGHT'=59
+'RLIKE'=60
+'QUERY'=61
+'SCHEMAS'=62
+'SELECT'=63
+'SHOW'=64
+'SYS'=65
+'TABLE'=66
+'TABLES'=67
+'TEXT'=68
+'TRUE'=69
+'TYPE'=70
+'TYPES'=71
+'USING'=72
+'VERIFY'=73
+'WHERE'=74
+'WITH'=75
+'{ESCAPE'=76
+'{FN'=77
+'{LIMIT'=78
+'{D'=79
+'{T'=80
+'{TS'=81
+'{GUID'=82
+'}'=83
+'='=84
+'<'=86
+'<='=87
+'>'=88
+'>='=89
+'+'=90
+'-'=91
+'*'=92
+'/'=93
+'%'=94
+'||'=95
+'.'=96
+'?'=97
diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/ExpressionBuilder.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/ExpressionBuilder.java
index 5375f50dde5..30f2edc53f1 100644
--- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/ExpressionBuilder.java
+++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/ExpressionBuilder.java
@@ -53,6 +53,7 @@ import org.elasticsearch.xpack.sql.parser.SqlBaseParser.BooleanLiteralContext;
import org.elasticsearch.xpack.sql.parser.SqlBaseParser.CastExpressionContext;
import org.elasticsearch.xpack.sql.parser.SqlBaseParser.CastTemplateContext;
import org.elasticsearch.xpack.sql.parser.SqlBaseParser.ComparisonContext;
+import org.elasticsearch.xpack.sql.parser.SqlBaseParser.ConvertTemplateContext;
import org.elasticsearch.xpack.sql.parser.SqlBaseParser.DateEscapedLiteralContext;
import org.elasticsearch.xpack.sql.parser.SqlBaseParser.DecimalLiteralContext;
import org.elasticsearch.xpack.sql.parser.SqlBaseParser.DereferenceContext;
@@ -397,8 +398,27 @@ abstract class ExpressionBuilder extends IdentifierBuilder {
//
@Override
public Cast visitCastExpression(CastExpressionContext ctx) {
- CastTemplateContext ctc = ctx.castTemplate();
- return new Cast(source(ctc), expression(ctc.expression()), typedParsing(ctc.dataType(), DataType.class));
+ CastTemplateContext castTc = ctx.castTemplate();
+ if (castTc != null) {
+ return new Cast(source(castTc), expression(castTc.expression()), typedParsing(castTc.dataType(), DataType.class));
+ } else {
+ ConvertTemplateContext convertTc = ctx.convertTemplate();
+ String convertDataType = convertTc.dataType().getText().toUpperCase(Locale.ROOT);
+ DataType dataType;
+ if (convertDataType.startsWith(DataType.ODBC_DATATYPE_PREFIX)) {
+ dataType = DataType.fromODBCType(convertDataType);
+ if (dataType == null) {
+ throw new ParsingException(source(convertTc.dataType()), "Invalid data type [{}] provided", convertDataType);
+ }
+ } else {
+ try {
+ dataType = DataType.valueOf(convertDataType);
+ } catch (IllegalArgumentException e) {
+ throw new ParsingException(source(convertTc.dataType()), "Invalid data type [{}] provided", convertDataType);
+ }
+ }
+ return new Cast(source(convertTc), expression(convertTc.expression()), dataType);
+ }
}
@Override
diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseBaseListener.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseBaseListener.java
index 7dc0d5e985d..380428b8ac9 100644
--- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseBaseListener.java
+++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseBaseListener.java
@@ -767,6 +767,18 @@ class SqlBaseBaseListener implements SqlBaseListener {
*
The default implementation does nothing.
*/
@Override public void exitCastTemplate(SqlBaseParser.CastTemplateContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterConvertTemplate(SqlBaseParser.ConvertTemplateContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitConvertTemplate(SqlBaseParser.ConvertTemplateContext ctx) { }
/**
* {@inheritDoc}
*
diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseBaseVisitor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseBaseVisitor.java
index 323fd914f55..1305d5788b7 100644
--- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseBaseVisitor.java
+++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseBaseVisitor.java
@@ -452,6 +452,13 @@ class SqlBaseBaseVisitor extends AbstractParseTreeVisitor implements SqlBa
* {@link #visitChildren} on {@code ctx}.
*/
@Override public T visitCastTemplate(SqlBaseParser.CastTemplateContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitConvertTemplate(SqlBaseParser.ConvertTemplateContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseLexer.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseLexer.java
index f82072aa13c..07406b4297a 100644
--- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseLexer.java
+++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseLexer.java
@@ -19,20 +19,20 @@ class SqlBaseLexer extends Lexer {
public static final int
T__0=1, T__1=2, T__2=3, T__3=4, ALL=5, ANALYZE=6, ANALYZED=7, AND=8, ANY=9,
AS=10, ASC=11, BETWEEN=12, BY=13, CAST=14, CATALOG=15, CATALOGS=16, COLUMNS=17,
- DEBUG=18, DESC=19, DESCRIBE=20, DISTINCT=21, ESCAPE=22, EXECUTABLE=23,
- EXISTS=24, EXPLAIN=25, EXTRACT=26, FALSE=27, FIRST=28, FORMAT=29, FROM=30,
- FULL=31, FUNCTIONS=32, GRAPHVIZ=33, GROUP=34, HAVING=35, IN=36, INNER=37,
- IS=38, JOIN=39, LAST=40, LEFT=41, LIKE=42, LIMIT=43, MAPPED=44, MATCH=45,
- NATURAL=46, NOT=47, NULL=48, NULLS=49, ON=50, OPTIMIZED=51, OR=52, ORDER=53,
- OUTER=54, PARSED=55, PHYSICAL=56, PLAN=57, RIGHT=58, RLIKE=59, QUERY=60,
- SCHEMAS=61, SELECT=62, SHOW=63, SYS=64, TABLE=65, TABLES=66, TEXT=67,
- TRUE=68, TYPE=69, TYPES=70, USING=71, VERIFY=72, WHERE=73, WITH=74, ESCAPE_ESC=75,
- FUNCTION_ESC=76, LIMIT_ESC=77, DATE_ESC=78, TIME_ESC=79, TIMESTAMP_ESC=80,
- GUID_ESC=81, ESC_END=82, EQ=83, NEQ=84, LT=85, LTE=86, GT=87, GTE=88,
- PLUS=89, MINUS=90, ASTERISK=91, SLASH=92, PERCENT=93, CONCAT=94, DOT=95,
- PARAM=96, STRING=97, INTEGER_VALUE=98, DECIMAL_VALUE=99, IDENTIFIER=100,
- DIGIT_IDENTIFIER=101, TABLE_IDENTIFIER=102, QUOTED_IDENTIFIER=103, BACKQUOTED_IDENTIFIER=104,
- SIMPLE_COMMENT=105, BRACKETED_COMMENT=106, WS=107, UNRECOGNIZED=108;
+ CONVERT=18, DEBUG=19, DESC=20, DESCRIBE=21, DISTINCT=22, ESCAPE=23, EXECUTABLE=24,
+ EXISTS=25, EXPLAIN=26, EXTRACT=27, FALSE=28, FIRST=29, FORMAT=30, FROM=31,
+ FULL=32, FUNCTIONS=33, GRAPHVIZ=34, GROUP=35, HAVING=36, IN=37, INNER=38,
+ IS=39, JOIN=40, LAST=41, LEFT=42, LIKE=43, LIMIT=44, MAPPED=45, MATCH=46,
+ NATURAL=47, NOT=48, NULL=49, NULLS=50, ON=51, OPTIMIZED=52, OR=53, ORDER=54,
+ OUTER=55, PARSED=56, PHYSICAL=57, PLAN=58, RIGHT=59, RLIKE=60, QUERY=61,
+ SCHEMAS=62, SELECT=63, SHOW=64, SYS=65, TABLE=66, TABLES=67, TEXT=68,
+ TRUE=69, TYPE=70, TYPES=71, USING=72, VERIFY=73, WHERE=74, WITH=75, ESCAPE_ESC=76,
+ FUNCTION_ESC=77, LIMIT_ESC=78, DATE_ESC=79, TIME_ESC=80, TIMESTAMP_ESC=81,
+ GUID_ESC=82, ESC_END=83, EQ=84, NEQ=85, LT=86, LTE=87, GT=88, GTE=89,
+ PLUS=90, MINUS=91, ASTERISK=92, SLASH=93, PERCENT=94, CONCAT=95, DOT=96,
+ PARAM=97, STRING=98, INTEGER_VALUE=99, DECIMAL_VALUE=100, IDENTIFIER=101,
+ DIGIT_IDENTIFIER=102, TABLE_IDENTIFIER=103, QUOTED_IDENTIFIER=104, BACKQUOTED_IDENTIFIER=105,
+ SIMPLE_COMMENT=106, BRACKETED_COMMENT=107, WS=108, UNRECOGNIZED=109;
public static String[] modeNames = {
"DEFAULT_MODE"
};
@@ -40,27 +40,28 @@ class SqlBaseLexer extends Lexer {
public static final String[] ruleNames = {
"T__0", "T__1", "T__2", "T__3", "ALL", "ANALYZE", "ANALYZED", "AND", "ANY",
"AS", "ASC", "BETWEEN", "BY", "CAST", "CATALOG", "CATALOGS", "COLUMNS",
- "DEBUG", "DESC", "DESCRIBE", "DISTINCT", "ESCAPE", "EXECUTABLE", "EXISTS",
- "EXPLAIN", "EXTRACT", "FALSE", "FIRST", "FORMAT", "FROM", "FULL", "FUNCTIONS",
- "GRAPHVIZ", "GROUP", "HAVING", "IN", "INNER", "IS", "JOIN", "LAST", "LEFT",
- "LIKE", "LIMIT", "MAPPED", "MATCH", "NATURAL", "NOT", "NULL", "NULLS",
- "ON", "OPTIMIZED", "OR", "ORDER", "OUTER", "PARSED", "PHYSICAL", "PLAN",
- "RIGHT", "RLIKE", "QUERY", "SCHEMAS", "SELECT", "SHOW", "SYS", "TABLE",
- "TABLES", "TEXT", "TRUE", "TYPE", "TYPES", "USING", "VERIFY", "WHERE",
- "WITH", "ESCAPE_ESC", "FUNCTION_ESC", "LIMIT_ESC", "DATE_ESC", "TIME_ESC",
- "TIMESTAMP_ESC", "GUID_ESC", "ESC_END", "EQ", "NEQ", "LT", "LTE", "GT",
- "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "CONCAT", "DOT",
- "PARAM", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE", "IDENTIFIER", "DIGIT_IDENTIFIER",
- "TABLE_IDENTIFIER", "QUOTED_IDENTIFIER", "BACKQUOTED_IDENTIFIER", "EXPONENT",
- "DIGIT", "LETTER", "SIMPLE_COMMENT", "BRACKETED_COMMENT", "WS", "UNRECOGNIZED"
+ "CONVERT", "DEBUG", "DESC", "DESCRIBE", "DISTINCT", "ESCAPE", "EXECUTABLE",
+ "EXISTS", "EXPLAIN", "EXTRACT", "FALSE", "FIRST", "FORMAT", "FROM", "FULL",
+ "FUNCTIONS", "GRAPHVIZ", "GROUP", "HAVING", "IN", "INNER", "IS", "JOIN",
+ "LAST", "LEFT", "LIKE", "LIMIT", "MAPPED", "MATCH", "NATURAL", "NOT",
+ "NULL", "NULLS", "ON", "OPTIMIZED", "OR", "ORDER", "OUTER", "PARSED",
+ "PHYSICAL", "PLAN", "RIGHT", "RLIKE", "QUERY", "SCHEMAS", "SELECT", "SHOW",
+ "SYS", "TABLE", "TABLES", "TEXT", "TRUE", "TYPE", "TYPES", "USING", "VERIFY",
+ "WHERE", "WITH", "ESCAPE_ESC", "FUNCTION_ESC", "LIMIT_ESC", "DATE_ESC",
+ "TIME_ESC", "TIMESTAMP_ESC", "GUID_ESC", "ESC_END", "EQ", "NEQ", "LT",
+ "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "CONCAT",
+ "DOT", "PARAM", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE", "IDENTIFIER",
+ "DIGIT_IDENTIFIER", "TABLE_IDENTIFIER", "QUOTED_IDENTIFIER", "BACKQUOTED_IDENTIFIER",
+ "EXPONENT", "DIGIT", "LETTER", "SIMPLE_COMMENT", "BRACKETED_COMMENT",
+ "WS", "UNRECOGNIZED"
};
private static final String[] _LITERAL_NAMES = {
null, "'('", "')'", "','", "':'", "'ALL'", "'ANALYZE'", "'ANALYZED'",
"'AND'", "'ANY'", "'AS'", "'ASC'", "'BETWEEN'", "'BY'", "'CAST'", "'CATALOG'",
- "'CATALOGS'", "'COLUMNS'", "'DEBUG'", "'DESC'", "'DESCRIBE'", "'DISTINCT'",
- "'ESCAPE'", "'EXECUTABLE'", "'EXISTS'", "'EXPLAIN'", "'EXTRACT'", "'FALSE'",
- "'FIRST'", "'FORMAT'", "'FROM'", "'FULL'", "'FUNCTIONS'", "'GRAPHVIZ'",
+ "'CATALOGS'", "'COLUMNS'", "'CONVERT'", "'DEBUG'", "'DESC'", "'DESCRIBE'",
+ "'DISTINCT'", "'ESCAPE'", "'EXECUTABLE'", "'EXISTS'", "'EXPLAIN'", "'EXTRACT'",
+ "'FALSE'", "'FIRST'", "'FORMAT'", "'FROM'", "'FULL'", "'FUNCTIONS'", "'GRAPHVIZ'",
"'GROUP'", "'HAVING'", "'IN'", "'INNER'", "'IS'", "'JOIN'", "'LAST'",
"'LEFT'", "'LIKE'", "'LIMIT'", "'MAPPED'", "'MATCH'", "'NATURAL'", "'NOT'",
"'NULL'", "'NULLS'", "'ON'", "'OPTIMIZED'", "'OR'", "'ORDER'", "'OUTER'",
@@ -74,19 +75,19 @@ class SqlBaseLexer extends Lexer {
private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, "ALL", "ANALYZE", "ANALYZED", "AND", "ANY",
"AS", "ASC", "BETWEEN", "BY", "CAST", "CATALOG", "CATALOGS", "COLUMNS",
- "DEBUG", "DESC", "DESCRIBE", "DISTINCT", "ESCAPE", "EXECUTABLE", "EXISTS",
- "EXPLAIN", "EXTRACT", "FALSE", "FIRST", "FORMAT", "FROM", "FULL", "FUNCTIONS",
- "GRAPHVIZ", "GROUP", "HAVING", "IN", "INNER", "IS", "JOIN", "LAST", "LEFT",
- "LIKE", "LIMIT", "MAPPED", "MATCH", "NATURAL", "NOT", "NULL", "NULLS",
- "ON", "OPTIMIZED", "OR", "ORDER", "OUTER", "PARSED", "PHYSICAL", "PLAN",
- "RIGHT", "RLIKE", "QUERY", "SCHEMAS", "SELECT", "SHOW", "SYS", "TABLE",
- "TABLES", "TEXT", "TRUE", "TYPE", "TYPES", "USING", "VERIFY", "WHERE",
- "WITH", "ESCAPE_ESC", "FUNCTION_ESC", "LIMIT_ESC", "DATE_ESC", "TIME_ESC",
- "TIMESTAMP_ESC", "GUID_ESC", "ESC_END", "EQ", "NEQ", "LT", "LTE", "GT",
- "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "CONCAT", "DOT",
- "PARAM", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE", "IDENTIFIER", "DIGIT_IDENTIFIER",
- "TABLE_IDENTIFIER", "QUOTED_IDENTIFIER", "BACKQUOTED_IDENTIFIER", "SIMPLE_COMMENT",
- "BRACKETED_COMMENT", "WS", "UNRECOGNIZED"
+ "CONVERT", "DEBUG", "DESC", "DESCRIBE", "DISTINCT", "ESCAPE", "EXECUTABLE",
+ "EXISTS", "EXPLAIN", "EXTRACT", "FALSE", "FIRST", "FORMAT", "FROM", "FULL",
+ "FUNCTIONS", "GRAPHVIZ", "GROUP", "HAVING", "IN", "INNER", "IS", "JOIN",
+ "LAST", "LEFT", "LIKE", "LIMIT", "MAPPED", "MATCH", "NATURAL", "NOT",
+ "NULL", "NULLS", "ON", "OPTIMIZED", "OR", "ORDER", "OUTER", "PARSED",
+ "PHYSICAL", "PLAN", "RIGHT", "RLIKE", "QUERY", "SCHEMAS", "SELECT", "SHOW",
+ "SYS", "TABLE", "TABLES", "TEXT", "TRUE", "TYPE", "TYPES", "USING", "VERIFY",
+ "WHERE", "WITH", "ESCAPE_ESC", "FUNCTION_ESC", "LIMIT_ESC", "DATE_ESC",
+ "TIME_ESC", "TIMESTAMP_ESC", "GUID_ESC", "ESC_END", "EQ", "NEQ", "LT",
+ "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "CONCAT",
+ "DOT", "PARAM", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE", "IDENTIFIER",
+ "DIGIT_IDENTIFIER", "TABLE_IDENTIFIER", "QUOTED_IDENTIFIER", "BACKQUOTED_IDENTIFIER",
+ "SIMPLE_COMMENT", "BRACKETED_COMMENT", "WS", "UNRECOGNIZED"
};
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@@ -143,7 +144,7 @@ class SqlBaseLexer extends Lexer {
public ATN getATN() { return _ATN; }
public static final String _serializedATN =
- "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2n\u0386\b\1\4\2\t"+
+ "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2o\u0390\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"+
@@ -155,298 +156,302 @@ class SqlBaseLexer extends Lexer {
"\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\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3"+
- "\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b"+
- "\3\b\3\b\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13\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\17\3\17\3\17\3\17"+
- "\3\17\3\20\3\20\3\20\3\20\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\21\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\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25"+
+ "k\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5"+
+ "\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3"+
+ "\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13\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\17\3\17\3\17"+
+ "\3\17\3\17\3\20\3\20\3\20\3\20\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\21\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\24\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\26\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\30\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\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\36\3\36\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\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\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65"+
- "\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67"+
- "\38\38\38\38\38\38\38\39\39\39\39\39\39\39\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?\3?\3?\3@\3@\3@\3@\3@\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B"+
- "\3C\3C\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3F\3F\3F\3F\3F\3G"+
- "\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J"+
- "\3J\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3N\3N\3N\3N\3N"+
- "\3N\3N\3O\3O\3O\3P\3P\3P\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3S\3S\3T\3T\3U"+
- "\3U\3U\3U\3U\3U\3U\5U\u02c7\nU\3V\3V\3W\3W\3W\3X\3X\3Y\3Y\3Y\3Z\3Z\3["+
- "\3[\3\\\3\\\3]\3]\3^\3^\3_\3_\3_\3`\3`\3a\3a\3b\3b\3b\3b\7b\u02e8\nb\f"+
- "b\16b\u02eb\13b\3b\3b\3c\6c\u02f0\nc\rc\16c\u02f1\3d\6d\u02f5\nd\rd\16"+
- "d\u02f6\3d\3d\7d\u02fb\nd\fd\16d\u02fe\13d\3d\3d\6d\u0302\nd\rd\16d\u0303"+
- "\3d\6d\u0307\nd\rd\16d\u0308\3d\3d\7d\u030d\nd\fd\16d\u0310\13d\5d\u0312"+
- "\nd\3d\3d\3d\3d\6d\u0318\nd\rd\16d\u0319\3d\3d\5d\u031e\nd\3e\3e\5e\u0322"+
- "\ne\3e\3e\3e\7e\u0327\ne\fe\16e\u032a\13e\3f\3f\3f\3f\6f\u0330\nf\rf\16"+
- "f\u0331\3g\3g\3g\6g\u0337\ng\rg\16g\u0338\3h\3h\3h\3h\7h\u033f\nh\fh\16"+
- "h\u0342\13h\3h\3h\3i\3i\3i\3i\7i\u034a\ni\fi\16i\u034d\13i\3i\3i\3j\3"+
- "j\5j\u0353\nj\3j\6j\u0356\nj\rj\16j\u0357\3k\3k\3l\3l\3m\3m\3m\3m\7m\u0362"+
- "\nm\fm\16m\u0365\13m\3m\5m\u0368\nm\3m\5m\u036b\nm\3m\3m\3n\3n\3n\3n\3"+
- "n\7n\u0374\nn\fn\16n\u0377\13n\3n\3n\3n\3n\3n\3o\6o\u037f\no\ro\16o\u0380"+
- "\3o\3o\3p\3p\3\u0375\2q\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\62"+
- "c\63e\64g\65i\66k\67m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087"+
- "E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009b"+
- "O\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00af"+
- "Y\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3"+
- "c\u00c5d\u00c7e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3\2\u00d5\2\u00d7"+
- "\2\u00d9k\u00dbl\u00ddm\u00dfn\3\2\f\3\2))\4\2BBaa\5\2<\3\2\2\2\u0194\u0195\7H\2\2\u0195\u0196"+
- "\7W\2\2\u0196\u0197\7N\2\2\u0197\u0198\7N\2\2\u0198@\3\2\2\2\u0199\u019a"+
- "\7H\2\2\u019a\u019b\7W\2\2\u019b\u019c\7P\2\2\u019c\u019d\7E\2\2\u019d"+
- "\u019e\7V\2\2\u019e\u019f\7K\2\2\u019f\u01a0\7Q\2\2\u01a0\u01a1\7P\2\2"+
- "\u01a1\u01a2\7U\2\2\u01a2B\3\2\2\2\u01a3\u01a4\7I\2\2\u01a4\u01a5\7T\2"+
- "\2\u01a5\u01a6\7C\2\2\u01a6\u01a7\7R\2\2\u01a7\u01a8\7J\2\2\u01a8\u01a9"+
- "\7X\2\2\u01a9\u01aa\7K\2\2\u01aa\u01ab\7\\\2\2\u01abD\3\2\2\2\u01ac\u01ad"+
- "\7I\2\2\u01ad\u01ae\7T\2\2\u01ae\u01af\7Q\2\2\u01af\u01b0\7W\2\2\u01b0"+
- "\u01b1\7R\2\2\u01b1F\3\2\2\2\u01b2\u01b3\7J\2\2\u01b3\u01b4\7C\2\2\u01b4"+
- "\u01b5\7X\2\2\u01b5\u01b6\7K\2\2\u01b6\u01b7\7P\2\2\u01b7\u01b8\7I\2\2"+
- "\u01b8H\3\2\2\2\u01b9\u01ba\7K\2\2\u01ba\u01bb\7P\2\2\u01bbJ\3\2\2\2\u01bc"+
- "\u01bd\7K\2\2\u01bd\u01be\7P\2\2\u01be\u01bf\7P\2\2\u01bf\u01c0\7G\2\2"+
- "\u01c0\u01c1\7T\2\2\u01c1L\3\2\2\2\u01c2\u01c3\7K\2\2\u01c3\u01c4\7U\2"+
- "\2\u01c4N\3\2\2\2\u01c5\u01c6\7L\2\2\u01c6\u01c7\7Q\2\2\u01c7\u01c8\7"+
- "K\2\2\u01c8\u01c9\7P\2\2\u01c9P\3\2\2\2\u01ca\u01cb\7N\2\2\u01cb\u01cc"+
- "\7C\2\2\u01cc\u01cd\7U\2\2\u01cd\u01ce\7V\2\2\u01ceR\3\2\2\2\u01cf\u01d0"+
- "\7N\2\2\u01d0\u01d1\7G\2\2\u01d1\u01d2\7H\2\2\u01d2\u01d3\7V\2\2\u01d3"+
- "T\3\2\2\2\u01d4\u01d5\7N\2\2\u01d5\u01d6\7K\2\2\u01d6\u01d7\7M\2\2\u01d7"+
- "\u01d8\7G\2\2\u01d8V\3\2\2\2\u01d9\u01da\7N\2\2\u01da\u01db\7K\2\2\u01db"+
- "\u01dc\7O\2\2\u01dc\u01dd\7K\2\2\u01dd\u01de\7V\2\2\u01deX\3\2\2\2\u01df"+
- "\u01e0\7O\2\2\u01e0\u01e1\7C\2\2\u01e1\u01e2\7R\2\2\u01e2\u01e3\7R\2\2"+
- "\u01e3\u01e4\7G\2\2\u01e4\u01e5\7F\2\2\u01e5Z\3\2\2\2\u01e6\u01e7\7O\2"+
- "\2\u01e7\u01e8\7C\2\2\u01e8\u01e9\7V\2\2\u01e9\u01ea\7E\2\2\u01ea\u01eb"+
- "\7J\2\2\u01eb\\\3\2\2\2\u01ec\u01ed\7P\2\2\u01ed\u01ee\7C\2\2\u01ee\u01ef"+
- "\7V\2\2\u01ef\u01f0\7W\2\2\u01f0\u01f1\7T\2\2\u01f1\u01f2\7C\2\2\u01f2"+
- "\u01f3\7N\2\2\u01f3^\3\2\2\2\u01f4\u01f5\7P\2\2\u01f5\u01f6\7Q\2\2\u01f6"+
- "\u01f7\7V\2\2\u01f7`\3\2\2\2\u01f8\u01f9\7P\2\2\u01f9\u01fa\7W\2\2\u01fa"+
- "\u01fb\7N\2\2\u01fb\u01fc\7N\2\2\u01fcb\3\2\2\2\u01fd\u01fe\7P\2\2\u01fe"+
- "\u01ff\7W\2\2\u01ff\u0200\7N\2\2\u0200\u0201\7N\2\2\u0201\u0202\7U\2\2"+
- "\u0202d\3\2\2\2\u0203\u0204\7Q\2\2\u0204\u0205\7P\2\2\u0205f\3\2\2\2\u0206"+
- "\u0207\7Q\2\2\u0207\u0208\7R\2\2\u0208\u0209\7V\2\2\u0209\u020a\7K\2\2"+
- "\u020a\u020b\7O\2\2\u020b\u020c\7K\2\2\u020c\u020d\7\\\2\2\u020d\u020e"+
- "\7G\2\2\u020e\u020f\7F\2\2\u020fh\3\2\2\2\u0210\u0211\7Q\2\2\u0211\u0212"+
- "\7T\2\2\u0212j\3\2\2\2\u0213\u0214\7Q\2\2\u0214\u0215\7T\2\2\u0215\u0216"+
- "\7F\2\2\u0216\u0217\7G\2\2\u0217\u0218\7T\2\2\u0218l\3\2\2\2\u0219\u021a"+
- "\7Q\2\2\u021a\u021b\7W\2\2\u021b\u021c\7V\2\2\u021c\u021d\7G\2\2\u021d"+
- "\u021e\7T\2\2\u021en\3\2\2\2\u021f\u0220\7R\2\2\u0220\u0221\7C\2\2\u0221"+
- "\u0222\7T\2\2\u0222\u0223\7U\2\2\u0223\u0224\7G\2\2\u0224\u0225\7F\2\2"+
- "\u0225p\3\2\2\2\u0226\u0227\7R\2\2\u0227\u0228\7J\2\2\u0228\u0229\7[\2"+
- "\2\u0229\u022a\7U\2\2\u022a\u022b\7K\2\2\u022b\u022c\7E\2\2\u022c\u022d"+
- "\7C\2\2\u022d\u022e\7N\2\2\u022er\3\2\2\2\u022f\u0230\7R\2\2\u0230\u0231"+
- "\7N\2\2\u0231\u0232\7C\2\2\u0232\u0233\7P\2\2\u0233t\3\2\2\2\u0234\u0235"+
- "\7T\2\2\u0235\u0236\7K\2\2\u0236\u0237\7I\2\2\u0237\u0238\7J\2\2\u0238"+
- "\u0239\7V\2\2\u0239v\3\2\2\2\u023a\u023b\7T\2\2\u023b\u023c\7N\2\2\u023c"+
- "\u023d\7K\2\2\u023d\u023e\7M\2\2\u023e\u023f\7G\2\2\u023fx\3\2\2\2\u0240"+
- "\u0241\7S\2\2\u0241\u0242\7W\2\2\u0242\u0243\7G\2\2\u0243\u0244\7T\2\2"+
- "\u0244\u0245\7[\2\2\u0245z\3\2\2\2\u0246\u0247\7U\2\2\u0247\u0248\7E\2"+
- "\2\u0248\u0249\7J\2\2\u0249\u024a\7G\2\2\u024a\u024b\7O\2\2\u024b\u024c"+
- "\7C\2\2\u024c\u024d\7U\2\2\u024d|\3\2\2\2\u024e\u024f\7U\2\2\u024f\u0250"+
- "\7G\2\2\u0250\u0251\7N\2\2\u0251\u0252\7G\2\2\u0252\u0253\7E\2\2\u0253"+
- "\u0254\7V\2\2\u0254~\3\2\2\2\u0255\u0256\7U\2\2\u0256\u0257\7J\2\2\u0257"+
- "\u0258\7Q\2\2\u0258\u0259\7Y\2\2\u0259\u0080\3\2\2\2\u025a\u025b\7U\2"+
- "\2\u025b\u025c\7[\2\2\u025c\u025d\7U\2\2\u025d\u0082\3\2\2\2\u025e\u025f"+
- "\7V\2\2\u025f\u0260\7C\2\2\u0260\u0261\7D\2\2\u0261\u0262\7N\2\2\u0262"+
- "\u0263\7G\2\2\u0263\u0084\3\2\2\2\u0264\u0265\7V\2\2\u0265\u0266\7C\2"+
- "\2\u0266\u0267\7D\2\2\u0267\u0268\7N\2\2\u0268\u0269\7G\2\2\u0269\u026a"+
- "\7U\2\2\u026a\u0086\3\2\2\2\u026b\u026c\7V\2\2\u026c\u026d\7G\2\2\u026d"+
- "\u026e\7Z\2\2\u026e\u026f\7V\2\2\u026f\u0088\3\2\2\2\u0270\u0271\7V\2"+
- "\2\u0271\u0272\7T\2\2\u0272\u0273\7W\2\2\u0273\u0274\7G\2\2\u0274\u008a"+
- "\3\2\2\2\u0275\u0276\7V\2\2\u0276\u0277\7[\2\2\u0277\u0278\7R\2\2\u0278"+
- "\u0279\7G\2\2\u0279\u008c\3\2\2\2\u027a\u027b\7V\2\2\u027b\u027c\7[\2"+
- "\2\u027c\u027d\7R\2\2\u027d\u027e\7G\2\2\u027e\u027f\7U\2\2\u027f\u008e"+
- "\3\2\2\2\u0280\u0281\7W\2\2\u0281\u0282\7U\2\2\u0282\u0283\7K\2\2\u0283"+
- "\u0284\7P\2\2\u0284\u0285\7I\2\2\u0285\u0090\3\2\2\2\u0286\u0287\7X\2"+
- "\2\u0287\u0288\7G\2\2\u0288\u0289\7T\2\2\u0289\u028a\7K\2\2\u028a\u028b"+
- "\7H\2\2\u028b\u028c\7[\2\2\u028c\u0092\3\2\2\2\u028d\u028e\7Y\2\2\u028e"+
- "\u028f\7J\2\2\u028f\u0290\7G\2\2\u0290\u0291\7T\2\2\u0291\u0292\7G\2\2"+
- "\u0292\u0094\3\2\2\2\u0293\u0294\7Y\2\2\u0294\u0295\7K\2\2\u0295\u0296"+
- "\7V\2\2\u0296\u0297\7J\2\2\u0297\u0096\3\2\2\2\u0298\u0299\7}\2\2\u0299"+
- "\u029a\7G\2\2\u029a\u029b\7U\2\2\u029b\u029c\7E\2\2\u029c\u029d\7C\2\2"+
- "\u029d\u029e\7R\2\2\u029e\u029f\7G\2\2\u029f\u0098\3\2\2\2\u02a0\u02a1"+
- "\7}\2\2\u02a1\u02a2\7H\2\2\u02a2\u02a3\7P\2\2\u02a3\u009a\3\2\2\2\u02a4"+
- "\u02a5\7}\2\2\u02a5\u02a6\7N\2\2\u02a6\u02a7\7K\2\2\u02a7\u02a8\7O\2\2"+
- "\u02a8\u02a9\7K\2\2\u02a9\u02aa\7V\2\2\u02aa\u009c\3\2\2\2\u02ab\u02ac"+
- "\7}\2\2\u02ac\u02ad\7F\2\2\u02ad\u009e\3\2\2\2\u02ae\u02af\7}\2\2\u02af"+
- "\u02b0\7V\2\2\u02b0\u00a0\3\2\2\2\u02b1\u02b2\7}\2\2\u02b2\u02b3\7V\2"+
- "\2\u02b3\u02b4\7U\2\2\u02b4\u00a2\3\2\2\2\u02b5\u02b6\7}\2\2\u02b6\u02b7"+
- "\7I\2\2\u02b7\u02b8\7W\2\2\u02b8\u02b9\7K\2\2\u02b9\u02ba\7F\2\2\u02ba"+
- "\u00a4\3\2\2\2\u02bb\u02bc\7\177\2\2\u02bc\u00a6\3\2\2\2\u02bd\u02be\7"+
- "?\2\2\u02be\u00a8\3\2\2\2\u02bf\u02c0\7>\2\2\u02c0\u02c7\7@\2\2\u02c1"+
- "\u02c2\7#\2\2\u02c2\u02c7\7?\2\2\u02c3\u02c4\7>\2\2\u02c4\u02c5\7?\2\2"+
- "\u02c5\u02c7\7@\2\2\u02c6\u02bf\3\2\2\2\u02c6\u02c1\3\2\2\2\u02c6\u02c3"+
- "\3\2\2\2\u02c7\u00aa\3\2\2\2\u02c8\u02c9\7>\2\2\u02c9\u00ac\3\2\2\2\u02ca"+
- "\u02cb\7>\2\2\u02cb\u02cc\7?\2\2\u02cc\u00ae\3\2\2\2\u02cd\u02ce\7@\2"+
- "\2\u02ce\u00b0\3\2\2\2\u02cf\u02d0\7@\2\2\u02d0\u02d1\7?\2\2\u02d1\u00b2"+
- "\3\2\2\2\u02d2\u02d3\7-\2\2\u02d3\u00b4\3\2\2\2\u02d4\u02d5\7/\2\2\u02d5"+
- "\u00b6\3\2\2\2\u02d6\u02d7\7,\2\2\u02d7\u00b8\3\2\2\2\u02d8\u02d9\7\61"+
- "\2\2\u02d9\u00ba\3\2\2\2\u02da\u02db\7\'\2\2\u02db\u00bc\3\2\2\2\u02dc"+
- "\u02dd\7~\2\2\u02dd\u02de\7~\2\2\u02de\u00be\3\2\2\2\u02df\u02e0\7\60"+
- "\2\2\u02e0\u00c0\3\2\2\2\u02e1\u02e2\7A\2\2\u02e2\u00c2\3\2\2\2\u02e3"+
- "\u02e9\7)\2\2\u02e4\u02e8\n\2\2\2\u02e5\u02e6\7)\2\2\u02e6\u02e8\7)\2"+
- "\2\u02e7\u02e4\3\2\2\2\u02e7\u02e5\3\2\2\2\u02e8\u02eb\3\2\2\2\u02e9\u02e7"+
- "\3\2\2\2\u02e9\u02ea\3\2\2\2\u02ea\u02ec\3\2\2\2\u02eb\u02e9\3\2\2\2\u02ec"+
- "\u02ed\7)\2\2\u02ed\u00c4\3\2\2\2\u02ee\u02f0\5\u00d5k\2\u02ef\u02ee\3"+
- "\2\2\2\u02f0\u02f1\3\2\2\2\u02f1\u02ef\3\2\2\2\u02f1\u02f2\3\2\2\2\u02f2"+
- "\u00c6\3\2\2\2\u02f3\u02f5\5\u00d5k\2\u02f4\u02f3\3\2\2\2\u02f5\u02f6"+
- "\3\2\2\2\u02f6\u02f4\3\2\2\2\u02f6\u02f7\3\2\2\2\u02f7\u02f8\3\2\2\2\u02f8"+
- "\u02fc\5\u00bf`\2\u02f9\u02fb\5\u00d5k\2\u02fa\u02f9\3\2\2\2\u02fb\u02fe"+
- "\3\2\2\2\u02fc\u02fa\3\2\2\2\u02fc\u02fd\3\2\2\2\u02fd\u031e\3\2\2\2\u02fe"+
- "\u02fc\3\2\2\2\u02ff\u0301\5\u00bf`\2\u0300\u0302\5\u00d5k\2\u0301\u0300"+
- "\3\2\2\2\u0302\u0303\3\2\2\2\u0303\u0301\3\2\2\2\u0303\u0304\3\2\2\2\u0304"+
- "\u031e\3\2\2\2\u0305\u0307\5\u00d5k\2\u0306\u0305\3\2\2\2\u0307\u0308"+
- "\3\2\2\2\u0308\u0306\3\2\2\2\u0308\u0309\3\2\2\2\u0309\u0311\3\2\2\2\u030a"+
- "\u030e\5\u00bf`\2\u030b\u030d\5\u00d5k\2\u030c\u030b\3\2\2\2\u030d\u0310"+
- "\3\2\2\2\u030e\u030c\3\2\2\2\u030e\u030f\3\2\2\2\u030f\u0312\3\2\2\2\u0310"+
- "\u030e\3\2\2\2\u0311\u030a\3\2\2\2\u0311\u0312\3\2\2\2\u0312\u0313\3\2"+
- "\2\2\u0313\u0314\5\u00d3j\2\u0314\u031e\3\2\2\2\u0315\u0317\5\u00bf`\2"+
- "\u0316\u0318\5\u00d5k\2\u0317\u0316\3\2\2\2\u0318\u0319\3\2\2\2\u0319"+
- "\u0317\3\2\2\2\u0319\u031a\3\2\2\2\u031a\u031b\3\2\2\2\u031b\u031c\5\u00d3"+
- "j\2\u031c\u031e\3\2\2\2\u031d\u02f4\3\2\2\2\u031d\u02ff\3\2\2\2\u031d"+
- "\u0306\3\2\2\2\u031d\u0315\3\2\2\2\u031e\u00c8\3\2\2\2\u031f\u0322\5\u00d7"+
- "l\2\u0320\u0322\7a\2\2\u0321\u031f\3\2\2\2\u0321\u0320\3\2\2\2\u0322\u0328"+
- "\3\2\2\2\u0323\u0327\5\u00d7l\2\u0324\u0327\5\u00d5k\2\u0325\u0327\t\3"+
- "\2\2\u0326\u0323\3\2\2\2\u0326\u0324\3\2\2\2\u0326\u0325\3\2\2\2\u0327"+
- "\u032a\3\2\2\2\u0328\u0326\3\2\2\2\u0328\u0329\3\2\2\2\u0329\u00ca\3\2"+
- "\2\2\u032a\u0328\3\2\2\2\u032b\u032f\5\u00d5k\2\u032c\u0330\5\u00d7l\2"+
- "\u032d\u0330\5\u00d5k\2\u032e\u0330\t\4\2\2\u032f\u032c\3\2\2\2\u032f"+
- "\u032d\3\2\2\2\u032f\u032e\3\2\2\2\u0330\u0331\3\2\2\2\u0331\u032f\3\2"+
- "\2\2\u0331\u0332\3\2\2\2\u0332\u00cc\3\2\2\2\u0333\u0337\5\u00d7l\2\u0334"+
- "\u0337\5\u00d5k\2\u0335\u0337\7a\2\2\u0336\u0333\3\2\2\2\u0336\u0334\3"+
- "\2\2\2\u0336\u0335\3\2\2\2\u0337\u0338\3\2\2\2\u0338\u0336\3\2\2\2\u0338"+
- "\u0339\3\2\2\2\u0339\u00ce\3\2\2\2\u033a\u0340\7$\2\2\u033b\u033f\n\5"+
- "\2\2\u033c\u033d\7$\2\2\u033d\u033f\7$\2\2\u033e\u033b\3\2\2\2\u033e\u033c"+
- "\3\2\2\2\u033f\u0342\3\2\2\2\u0340\u033e\3\2\2\2\u0340\u0341\3\2\2\2\u0341"+
- "\u0343\3\2\2\2\u0342\u0340\3\2\2\2\u0343\u0344\7$\2\2\u0344\u00d0\3\2"+
- "\2\2\u0345\u034b\7b\2\2\u0346\u034a\n\6\2\2\u0347\u0348\7b\2\2\u0348\u034a"+
- "\7b\2\2\u0349\u0346\3\2\2\2\u0349\u0347\3\2\2\2\u034a\u034d\3\2\2\2\u034b"+
- "\u0349\3\2\2\2\u034b\u034c\3\2\2\2\u034c\u034e\3\2\2\2\u034d\u034b\3\2"+
- "\2\2\u034e\u034f\7b\2\2\u034f\u00d2\3\2\2\2\u0350\u0352\7G\2\2\u0351\u0353"+
- "\t\7\2\2\u0352\u0351\3\2\2\2\u0352\u0353\3\2\2\2\u0353\u0355\3\2\2\2\u0354"+
- "\u0356\5\u00d5k\2\u0355\u0354\3\2\2\2\u0356\u0357\3\2\2\2\u0357\u0355"+
- "\3\2\2\2\u0357\u0358\3\2\2\2\u0358\u00d4\3\2\2\2\u0359\u035a\t\b\2\2\u035a"+
- "\u00d6\3\2\2\2\u035b\u035c\t\t\2\2\u035c\u00d8\3\2\2\2\u035d\u035e\7/"+
- "\2\2\u035e\u035f\7/\2\2\u035f\u0363\3\2\2\2\u0360\u0362\n\n\2\2\u0361"+
- "\u0360\3\2\2\2\u0362\u0365\3\2\2\2\u0363\u0361\3\2\2\2\u0363\u0364\3\2"+
- "\2\2\u0364\u0367\3\2\2\2\u0365\u0363\3\2\2\2\u0366\u0368\7\17\2\2\u0367"+
- "\u0366\3\2\2\2\u0367\u0368\3\2\2\2\u0368\u036a\3\2\2\2\u0369\u036b\7\f"+
- "\2\2\u036a\u0369\3\2\2\2\u036a\u036b\3\2\2\2\u036b\u036c\3\2\2\2\u036c"+
- "\u036d\bm\2\2\u036d\u00da\3\2\2\2\u036e\u036f\7\61\2\2\u036f\u0370\7,"+
- "\2\2\u0370\u0375\3\2\2\2\u0371\u0374\5\u00dbn\2\u0372\u0374\13\2\2\2\u0373"+
- "\u0371\3\2\2\2\u0373\u0372\3\2\2\2\u0374\u0377\3\2\2\2\u0375\u0376\3\2"+
- "\2\2\u0375\u0373\3\2\2\2\u0376\u0378\3\2\2\2\u0377\u0375\3\2\2\2\u0378"+
- "\u0379\7,\2\2\u0379\u037a\7\61\2\2\u037a\u037b\3\2\2\2\u037b\u037c\bn"+
- "\2\2\u037c\u00dc\3\2\2\2\u037d\u037f\t\13\2\2\u037e\u037d\3\2\2\2\u037f"+
- "\u0380\3\2\2\2\u0380\u037e\3\2\2\2\u0380\u0381\3\2\2\2\u0381\u0382\3\2"+
- "\2\2\u0382\u0383\bo\2\2\u0383\u00de\3\2\2\2\u0384\u0385\13\2\2\2\u0385"+
- "\u00e0\3\2\2\2\"\2\u02c6\u02e7\u02e9\u02f1\u02f6\u02fc\u0303\u0308\u030e"+
- "\u0311\u0319\u031d\u0321\u0326\u0328\u032f\u0331\u0336\u0338\u033e\u0340"+
- "\u0349\u034b\u0352\u0357\u0363\u0367\u036a\u0373\u0375\u0380\3\2\3\2";
+ "\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\30"+
+ "\3\30\3\31\3\31\3\31\3\31\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\33\3\33\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\34\3\34\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\37\3\37\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\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61"+
+ "\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\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\67"+
+ "\3\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38\39\39\39\39\39\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?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3"+
+ "A\3A\3A\3A\3A\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3E\3"+
+ "E\3E\3E\3E\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3I\3I\3I\3"+
+ "I\3I\3I\3J\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3M\3M\3"+
+ "M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3O\3P\3P\3P\3Q\3Q\3Q\3"+
+ "R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3T\3T\3U\3U\3V\3V\3V\3V\3V\3V\3V\5V\u02d1"+
+ "\nV\3W\3W\3X\3X\3X\3Y\3Y\3Z\3Z\3Z\3[\3[\3\\\3\\\3]\3]\3^\3^\3_\3_\3`\3"+
+ "`\3`\3a\3a\3b\3b\3c\3c\3c\3c\7c\u02f2\nc\fc\16c\u02f5\13c\3c\3c\3d\6d"+
+ "\u02fa\nd\rd\16d\u02fb\3e\6e\u02ff\ne\re\16e\u0300\3e\3e\7e\u0305\ne\f"+
+ "e\16e\u0308\13e\3e\3e\6e\u030c\ne\re\16e\u030d\3e\6e\u0311\ne\re\16e\u0312"+
+ "\3e\3e\7e\u0317\ne\fe\16e\u031a\13e\5e\u031c\ne\3e\3e\3e\3e\6e\u0322\n"+
+ "e\re\16e\u0323\3e\3e\5e\u0328\ne\3f\3f\5f\u032c\nf\3f\3f\3f\7f\u0331\n"+
+ "f\ff\16f\u0334\13f\3g\3g\3g\3g\6g\u033a\ng\rg\16g\u033b\3h\3h\3h\6h\u0341"+
+ "\nh\rh\16h\u0342\3i\3i\3i\3i\7i\u0349\ni\fi\16i\u034c\13i\3i\3i\3j\3j"+
+ "\3j\3j\7j\u0354\nj\fj\16j\u0357\13j\3j\3j\3k\3k\5k\u035d\nk\3k\6k\u0360"+
+ "\nk\rk\16k\u0361\3l\3l\3m\3m\3n\3n\3n\3n\7n\u036c\nn\fn\16n\u036f\13n"+
+ "\3n\5n\u0372\nn\3n\5n\u0375\nn\3n\3n\3o\3o\3o\3o\3o\7o\u037e\no\fo\16"+
+ "o\u0381\13o\3o\3o\3o\3o\3o\3p\6p\u0389\np\rp\16p\u038a\3p\3p\3q\3q\3\u037f"+
+ "\2r\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\67"+
+ "m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008d"+
+ "H\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1"+
+ "R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5"+
+ "\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9"+
+ "f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5\2\u00d7\2\u00d9\2\u00dbl\u00dd"+
+ "m\u00dfn\u00e1o\3\2\f\3\2))\4\2BBaa\5\2<\3\2\2\2\u0199\u019a\7H\2\2\u019a\u019b\7T\2"+
+ "\2\u019b\u019c\7Q\2\2\u019c\u019d\7O\2\2\u019d@\3\2\2\2\u019e\u019f\7"+
+ "H\2\2\u019f\u01a0\7W\2\2\u01a0\u01a1\7N\2\2\u01a1\u01a2\7N\2\2\u01a2B"+
+ "\3\2\2\2\u01a3\u01a4\7H\2\2\u01a4\u01a5\7W\2\2\u01a5\u01a6\7P\2\2\u01a6"+
+ "\u01a7\7E\2\2\u01a7\u01a8\7V\2\2\u01a8\u01a9\7K\2\2\u01a9\u01aa\7Q\2\2"+
+ "\u01aa\u01ab\7P\2\2\u01ab\u01ac\7U\2\2\u01acD\3\2\2\2\u01ad\u01ae\7I\2"+
+ "\2\u01ae\u01af\7T\2\2\u01af\u01b0\7C\2\2\u01b0\u01b1\7R\2\2\u01b1\u01b2"+
+ "\7J\2\2\u01b2\u01b3\7X\2\2\u01b3\u01b4\7K\2\2\u01b4\u01b5\7\\\2\2\u01b5"+
+ "F\3\2\2\2\u01b6\u01b7\7I\2\2\u01b7\u01b8\7T\2\2\u01b8\u01b9\7Q\2\2\u01b9"+
+ "\u01ba\7W\2\2\u01ba\u01bb\7R\2\2\u01bbH\3\2\2\2\u01bc\u01bd\7J\2\2\u01bd"+
+ "\u01be\7C\2\2\u01be\u01bf\7X\2\2\u01bf\u01c0\7K\2\2\u01c0\u01c1\7P\2\2"+
+ "\u01c1\u01c2\7I\2\2\u01c2J\3\2\2\2\u01c3\u01c4\7K\2\2\u01c4\u01c5\7P\2"+
+ "\2\u01c5L\3\2\2\2\u01c6\u01c7\7K\2\2\u01c7\u01c8\7P\2\2\u01c8\u01c9\7"+
+ "P\2\2\u01c9\u01ca\7G\2\2\u01ca\u01cb\7T\2\2\u01cbN\3\2\2\2\u01cc\u01cd"+
+ "\7K\2\2\u01cd\u01ce\7U\2\2\u01ceP\3\2\2\2\u01cf\u01d0\7L\2\2\u01d0\u01d1"+
+ "\7Q\2\2\u01d1\u01d2\7K\2\2\u01d2\u01d3\7P\2\2\u01d3R\3\2\2\2\u01d4\u01d5"+
+ "\7N\2\2\u01d5\u01d6\7C\2\2\u01d6\u01d7\7U\2\2\u01d7\u01d8\7V\2\2\u01d8"+
+ "T\3\2\2\2\u01d9\u01da\7N\2\2\u01da\u01db\7G\2\2\u01db\u01dc\7H\2\2\u01dc"+
+ "\u01dd\7V\2\2\u01ddV\3\2\2\2\u01de\u01df\7N\2\2\u01df\u01e0\7K\2\2\u01e0"+
+ "\u01e1\7M\2\2\u01e1\u01e2\7G\2\2\u01e2X\3\2\2\2\u01e3\u01e4\7N\2\2\u01e4"+
+ "\u01e5\7K\2\2\u01e5\u01e6\7O\2\2\u01e6\u01e7\7K\2\2\u01e7\u01e8\7V\2\2"+
+ "\u01e8Z\3\2\2\2\u01e9\u01ea\7O\2\2\u01ea\u01eb\7C\2\2\u01eb\u01ec\7R\2"+
+ "\2\u01ec\u01ed\7R\2\2\u01ed\u01ee\7G\2\2\u01ee\u01ef\7F\2\2\u01ef\\\3"+
+ "\2\2\2\u01f0\u01f1\7O\2\2\u01f1\u01f2\7C\2\2\u01f2\u01f3\7V\2\2\u01f3"+
+ "\u01f4\7E\2\2\u01f4\u01f5\7J\2\2\u01f5^\3\2\2\2\u01f6\u01f7\7P\2\2\u01f7"+
+ "\u01f8\7C\2\2\u01f8\u01f9\7V\2\2\u01f9\u01fa\7W\2\2\u01fa\u01fb\7T\2\2"+
+ "\u01fb\u01fc\7C\2\2\u01fc\u01fd\7N\2\2\u01fd`\3\2\2\2\u01fe\u01ff\7P\2"+
+ "\2\u01ff\u0200\7Q\2\2\u0200\u0201\7V\2\2\u0201b\3\2\2\2\u0202\u0203\7"+
+ "P\2\2\u0203\u0204\7W\2\2\u0204\u0205\7N\2\2\u0205\u0206\7N\2\2\u0206d"+
+ "\3\2\2\2\u0207\u0208\7P\2\2\u0208\u0209\7W\2\2\u0209\u020a\7N\2\2\u020a"+
+ "\u020b\7N\2\2\u020b\u020c\7U\2\2\u020cf\3\2\2\2\u020d\u020e\7Q\2\2\u020e"+
+ "\u020f\7P\2\2\u020fh\3\2\2\2\u0210\u0211\7Q\2\2\u0211\u0212\7R\2\2\u0212"+
+ "\u0213\7V\2\2\u0213\u0214\7K\2\2\u0214\u0215\7O\2\2\u0215\u0216\7K\2\2"+
+ "\u0216\u0217\7\\\2\2\u0217\u0218\7G\2\2\u0218\u0219\7F\2\2\u0219j\3\2"+
+ "\2\2\u021a\u021b\7Q\2\2\u021b\u021c\7T\2\2\u021cl\3\2\2\2\u021d\u021e"+
+ "\7Q\2\2\u021e\u021f\7T\2\2\u021f\u0220\7F\2\2\u0220\u0221\7G\2\2\u0221"+
+ "\u0222\7T\2\2\u0222n\3\2\2\2\u0223\u0224\7Q\2\2\u0224\u0225\7W\2\2\u0225"+
+ "\u0226\7V\2\2\u0226\u0227\7G\2\2\u0227\u0228\7T\2\2\u0228p\3\2\2\2\u0229"+
+ "\u022a\7R\2\2\u022a\u022b\7C\2\2\u022b\u022c\7T\2\2\u022c\u022d\7U\2\2"+
+ "\u022d\u022e\7G\2\2\u022e\u022f\7F\2\2\u022fr\3\2\2\2\u0230\u0231\7R\2"+
+ "\2\u0231\u0232\7J\2\2\u0232\u0233\7[\2\2\u0233\u0234\7U\2\2\u0234\u0235"+
+ "\7K\2\2\u0235\u0236\7E\2\2\u0236\u0237\7C\2\2\u0237\u0238\7N\2\2\u0238"+
+ "t\3\2\2\2\u0239\u023a\7R\2\2\u023a\u023b\7N\2\2\u023b\u023c\7C\2\2\u023c"+
+ "\u023d\7P\2\2\u023dv\3\2\2\2\u023e\u023f\7T\2\2\u023f\u0240\7K\2\2\u0240"+
+ "\u0241\7I\2\2\u0241\u0242\7J\2\2\u0242\u0243\7V\2\2\u0243x\3\2\2\2\u0244"+
+ "\u0245\7T\2\2\u0245\u0246\7N\2\2\u0246\u0247\7K\2\2\u0247\u0248\7M\2\2"+
+ "\u0248\u0249\7G\2\2\u0249z\3\2\2\2\u024a\u024b\7S\2\2\u024b\u024c\7W\2"+
+ "\2\u024c\u024d\7G\2\2\u024d\u024e\7T\2\2\u024e\u024f\7[\2\2\u024f|\3\2"+
+ "\2\2\u0250\u0251\7U\2\2\u0251\u0252\7E\2\2\u0252\u0253\7J\2\2\u0253\u0254"+
+ "\7G\2\2\u0254\u0255\7O\2\2\u0255\u0256\7C\2\2\u0256\u0257\7U\2\2\u0257"+
+ "~\3\2\2\2\u0258\u0259\7U\2\2\u0259\u025a\7G\2\2\u025a\u025b\7N\2\2\u025b"+
+ "\u025c\7G\2\2\u025c\u025d\7E\2\2\u025d\u025e\7V\2\2\u025e\u0080\3\2\2"+
+ "\2\u025f\u0260\7U\2\2\u0260\u0261\7J\2\2\u0261\u0262\7Q\2\2\u0262\u0263"+
+ "\7Y\2\2\u0263\u0082\3\2\2\2\u0264\u0265\7U\2\2\u0265\u0266\7[\2\2\u0266"+
+ "\u0267\7U\2\2\u0267\u0084\3\2\2\2\u0268\u0269\7V\2\2\u0269\u026a\7C\2"+
+ "\2\u026a\u026b\7D\2\2\u026b\u026c\7N\2\2\u026c\u026d\7G\2\2\u026d\u0086"+
+ "\3\2\2\2\u026e\u026f\7V\2\2\u026f\u0270\7C\2\2\u0270\u0271\7D\2\2\u0271"+
+ "\u0272\7N\2\2\u0272\u0273\7G\2\2\u0273\u0274\7U\2\2\u0274\u0088\3\2\2"+
+ "\2\u0275\u0276\7V\2\2\u0276\u0277\7G\2\2\u0277\u0278\7Z\2\2\u0278\u0279"+
+ "\7V\2\2\u0279\u008a\3\2\2\2\u027a\u027b\7V\2\2\u027b\u027c\7T\2\2\u027c"+
+ "\u027d\7W\2\2\u027d\u027e\7G\2\2\u027e\u008c\3\2\2\2\u027f\u0280\7V\2"+
+ "\2\u0280\u0281\7[\2\2\u0281\u0282\7R\2\2\u0282\u0283\7G\2\2\u0283\u008e"+
+ "\3\2\2\2\u0284\u0285\7V\2\2\u0285\u0286\7[\2\2\u0286\u0287\7R\2\2\u0287"+
+ "\u0288\7G\2\2\u0288\u0289\7U\2\2\u0289\u0090\3\2\2\2\u028a\u028b\7W\2"+
+ "\2\u028b\u028c\7U\2\2\u028c\u028d\7K\2\2\u028d\u028e\7P\2\2\u028e\u028f"+
+ "\7I\2\2\u028f\u0092\3\2\2\2\u0290\u0291\7X\2\2\u0291\u0292\7G\2\2\u0292"+
+ "\u0293\7T\2\2\u0293\u0294\7K\2\2\u0294\u0295\7H\2\2\u0295\u0296\7[\2\2"+
+ "\u0296\u0094\3\2\2\2\u0297\u0298\7Y\2\2\u0298\u0299\7J\2\2\u0299\u029a"+
+ "\7G\2\2\u029a\u029b\7T\2\2\u029b\u029c\7G\2\2\u029c\u0096\3\2\2\2\u029d"+
+ "\u029e\7Y\2\2\u029e\u029f\7K\2\2\u029f\u02a0\7V\2\2\u02a0\u02a1\7J\2\2"+
+ "\u02a1\u0098\3\2\2\2\u02a2\u02a3\7}\2\2\u02a3\u02a4\7G\2\2\u02a4\u02a5"+
+ "\7U\2\2\u02a5\u02a6\7E\2\2\u02a6\u02a7\7C\2\2\u02a7\u02a8\7R\2\2\u02a8"+
+ "\u02a9\7G\2\2\u02a9\u009a\3\2\2\2\u02aa\u02ab\7}\2\2\u02ab\u02ac\7H\2"+
+ "\2\u02ac\u02ad\7P\2\2\u02ad\u009c\3\2\2\2\u02ae\u02af\7}\2\2\u02af\u02b0"+
+ "\7N\2\2\u02b0\u02b1\7K\2\2\u02b1\u02b2\7O\2\2\u02b2\u02b3\7K\2\2\u02b3"+
+ "\u02b4\7V\2\2\u02b4\u009e\3\2\2\2\u02b5\u02b6\7}\2\2\u02b6\u02b7\7F\2"+
+ "\2\u02b7\u00a0\3\2\2\2\u02b8\u02b9\7}\2\2\u02b9\u02ba\7V\2\2\u02ba\u00a2"+
+ "\3\2\2\2\u02bb\u02bc\7}\2\2\u02bc\u02bd\7V\2\2\u02bd\u02be\7U\2\2\u02be"+
+ "\u00a4\3\2\2\2\u02bf\u02c0\7}\2\2\u02c0\u02c1\7I\2\2\u02c1\u02c2\7W\2"+
+ "\2\u02c2\u02c3\7K\2\2\u02c3\u02c4\7F\2\2\u02c4\u00a6\3\2\2\2\u02c5\u02c6"+
+ "\7\177\2\2\u02c6\u00a8\3\2\2\2\u02c7\u02c8\7?\2\2\u02c8\u00aa\3\2\2\2"+
+ "\u02c9\u02ca\7>\2\2\u02ca\u02d1\7@\2\2\u02cb\u02cc\7#\2\2\u02cc\u02d1"+
+ "\7?\2\2\u02cd\u02ce\7>\2\2\u02ce\u02cf\7?\2\2\u02cf\u02d1\7@\2\2\u02d0"+
+ "\u02c9\3\2\2\2\u02d0\u02cb\3\2\2\2\u02d0\u02cd\3\2\2\2\u02d1\u00ac\3\2"+
+ "\2\2\u02d2\u02d3\7>\2\2\u02d3\u00ae\3\2\2\2\u02d4\u02d5\7>\2\2\u02d5\u02d6"+
+ "\7?\2\2\u02d6\u00b0\3\2\2\2\u02d7\u02d8\7@\2\2\u02d8\u00b2\3\2\2\2\u02d9"+
+ "\u02da\7@\2\2\u02da\u02db\7?\2\2\u02db\u00b4\3\2\2\2\u02dc\u02dd\7-\2"+
+ "\2\u02dd\u00b6\3\2\2\2\u02de\u02df\7/\2\2\u02df\u00b8\3\2\2\2\u02e0\u02e1"+
+ "\7,\2\2\u02e1\u00ba\3\2\2\2\u02e2\u02e3\7\61\2\2\u02e3\u00bc\3\2\2\2\u02e4"+
+ "\u02e5\7\'\2\2\u02e5\u00be\3\2\2\2\u02e6\u02e7\7~\2\2\u02e7\u02e8\7~\2"+
+ "\2\u02e8\u00c0\3\2\2\2\u02e9\u02ea\7\60\2\2\u02ea\u00c2\3\2\2\2\u02eb"+
+ "\u02ec\7A\2\2\u02ec\u00c4\3\2\2\2\u02ed\u02f3\7)\2\2\u02ee\u02f2\n\2\2"+
+ "\2\u02ef\u02f0\7)\2\2\u02f0\u02f2\7)\2\2\u02f1\u02ee\3\2\2\2\u02f1\u02ef"+
+ "\3\2\2\2\u02f2\u02f5\3\2\2\2\u02f3\u02f1\3\2\2\2\u02f3\u02f4\3\2\2\2\u02f4"+
+ "\u02f6\3\2\2\2\u02f5\u02f3\3\2\2\2\u02f6\u02f7\7)\2\2\u02f7\u00c6\3\2"+
+ "\2\2\u02f8\u02fa\5\u00d7l\2\u02f9\u02f8\3\2\2\2\u02fa\u02fb\3\2\2\2\u02fb"+
+ "\u02f9\3\2\2\2\u02fb\u02fc\3\2\2\2\u02fc\u00c8\3\2\2\2\u02fd\u02ff\5\u00d7"+
+ "l\2\u02fe\u02fd\3\2\2\2\u02ff\u0300\3\2\2\2\u0300\u02fe\3\2\2\2\u0300"+
+ "\u0301\3\2\2\2\u0301\u0302\3\2\2\2\u0302\u0306\5\u00c1a\2\u0303\u0305"+
+ "\5\u00d7l\2\u0304\u0303\3\2\2\2\u0305\u0308\3\2\2\2\u0306\u0304\3\2\2"+
+ "\2\u0306\u0307\3\2\2\2\u0307\u0328\3\2\2\2\u0308\u0306\3\2\2\2\u0309\u030b"+
+ "\5\u00c1a\2\u030a\u030c\5\u00d7l\2\u030b\u030a\3\2\2\2\u030c\u030d\3\2"+
+ "\2\2\u030d\u030b\3\2\2\2\u030d\u030e\3\2\2\2\u030e\u0328\3\2\2\2\u030f"+
+ "\u0311\5\u00d7l\2\u0310\u030f\3\2\2\2\u0311\u0312\3\2\2\2\u0312\u0310"+
+ "\3\2\2\2\u0312\u0313\3\2\2\2\u0313\u031b\3\2\2\2\u0314\u0318\5\u00c1a"+
+ "\2\u0315\u0317\5\u00d7l\2\u0316\u0315\3\2\2\2\u0317\u031a\3\2\2\2\u0318"+
+ "\u0316\3\2\2\2\u0318\u0319\3\2\2\2\u0319\u031c\3\2\2\2\u031a\u0318\3\2"+
+ "\2\2\u031b\u0314\3\2\2\2\u031b\u031c\3\2\2\2\u031c\u031d\3\2\2\2\u031d"+
+ "\u031e\5\u00d5k\2\u031e\u0328\3\2\2\2\u031f\u0321\5\u00c1a\2\u0320\u0322"+
+ "\5\u00d7l\2\u0321\u0320\3\2\2\2\u0322\u0323\3\2\2\2\u0323\u0321\3\2\2"+
+ "\2\u0323\u0324\3\2\2\2\u0324\u0325\3\2\2\2\u0325\u0326\5\u00d5k\2\u0326"+
+ "\u0328\3\2\2\2\u0327\u02fe\3\2\2\2\u0327\u0309\3\2\2\2\u0327\u0310\3\2"+
+ "\2\2\u0327\u031f\3\2\2\2\u0328\u00ca\3\2\2\2\u0329\u032c\5\u00d9m\2\u032a"+
+ "\u032c\7a\2\2\u032b\u0329\3\2\2\2\u032b\u032a\3\2\2\2\u032c\u0332\3\2"+
+ "\2\2\u032d\u0331\5\u00d9m\2\u032e\u0331\5\u00d7l\2\u032f\u0331\t\3\2\2"+
+ "\u0330\u032d\3\2\2\2\u0330\u032e\3\2\2\2\u0330\u032f\3\2\2\2\u0331\u0334"+
+ "\3\2\2\2\u0332\u0330\3\2\2\2\u0332\u0333\3\2\2\2\u0333\u00cc\3\2\2\2\u0334"+
+ "\u0332\3\2\2\2\u0335\u0339\5\u00d7l\2\u0336\u033a\5\u00d9m\2\u0337\u033a"+
+ "\5\u00d7l\2\u0338\u033a\t\4\2\2\u0339\u0336\3\2\2\2\u0339\u0337\3\2\2"+
+ "\2\u0339\u0338\3\2\2\2\u033a\u033b\3\2\2\2\u033b\u0339\3\2\2\2\u033b\u033c"+
+ "\3\2\2\2\u033c\u00ce\3\2\2\2\u033d\u0341\5\u00d9m\2\u033e\u0341\5\u00d7"+
+ "l\2\u033f\u0341\7a\2\2\u0340\u033d\3\2\2\2\u0340\u033e\3\2\2\2\u0340\u033f"+
+ "\3\2\2\2\u0341\u0342\3\2\2\2\u0342\u0340\3\2\2\2\u0342\u0343\3\2\2\2\u0343"+
+ "\u00d0\3\2\2\2\u0344\u034a\7$\2\2\u0345\u0349\n\5\2\2\u0346\u0347\7$\2"+
+ "\2\u0347\u0349\7$\2\2\u0348\u0345\3\2\2\2\u0348\u0346\3\2\2\2\u0349\u034c"+
+ "\3\2\2\2\u034a\u0348\3\2\2\2\u034a\u034b\3\2\2\2\u034b\u034d\3\2\2\2\u034c"+
+ "\u034a\3\2\2\2\u034d\u034e\7$\2\2\u034e\u00d2\3\2\2\2\u034f\u0355\7b\2"+
+ "\2\u0350\u0354\n\6\2\2\u0351\u0352\7b\2\2\u0352\u0354\7b\2\2\u0353\u0350"+
+ "\3\2\2\2\u0353\u0351\3\2\2\2\u0354\u0357\3\2\2\2\u0355\u0353\3\2\2\2\u0355"+
+ "\u0356\3\2\2\2\u0356\u0358\3\2\2\2\u0357\u0355\3\2\2\2\u0358\u0359\7b"+
+ "\2\2\u0359\u00d4\3\2\2\2\u035a\u035c\7G\2\2\u035b\u035d\t\7\2\2\u035c"+
+ "\u035b\3\2\2\2\u035c\u035d\3\2\2\2\u035d\u035f\3\2\2\2\u035e\u0360\5\u00d7"+
+ "l\2\u035f\u035e\3\2\2\2\u0360\u0361\3\2\2\2\u0361\u035f\3\2\2\2\u0361"+
+ "\u0362\3\2\2\2\u0362\u00d6\3\2\2\2\u0363\u0364\t\b\2\2\u0364\u00d8\3\2"+
+ "\2\2\u0365\u0366\t\t\2\2\u0366\u00da\3\2\2\2\u0367\u0368\7/\2\2\u0368"+
+ "\u0369\7/\2\2\u0369\u036d\3\2\2\2\u036a\u036c\n\n\2\2\u036b\u036a\3\2"+
+ "\2\2\u036c\u036f\3\2\2\2\u036d\u036b\3\2\2\2\u036d\u036e\3\2\2\2\u036e"+
+ "\u0371\3\2\2\2\u036f\u036d\3\2\2\2\u0370\u0372\7\17\2\2\u0371\u0370\3"+
+ "\2\2\2\u0371\u0372\3\2\2\2\u0372\u0374\3\2\2\2\u0373\u0375\7\f\2\2\u0374"+
+ "\u0373\3\2\2\2\u0374\u0375\3\2\2\2\u0375\u0376\3\2\2\2\u0376\u0377\bn"+
+ "\2\2\u0377\u00dc\3\2\2\2\u0378\u0379\7\61\2\2\u0379\u037a\7,\2\2\u037a"+
+ "\u037f\3\2\2\2\u037b\u037e\5\u00ddo\2\u037c\u037e\13\2\2\2\u037d\u037b"+
+ "\3\2\2\2\u037d\u037c\3\2\2\2\u037e\u0381\3\2\2\2\u037f\u0380\3\2\2\2\u037f"+
+ "\u037d\3\2\2\2\u0380\u0382\3\2\2\2\u0381\u037f\3\2\2\2\u0382\u0383\7,"+
+ "\2\2\u0383\u0384\7\61\2\2\u0384\u0385\3\2\2\2\u0385\u0386\bo\2\2\u0386"+
+ "\u00de\3\2\2\2\u0387\u0389\t\13\2\2\u0388\u0387\3\2\2\2\u0389\u038a\3"+
+ "\2\2\2\u038a\u0388\3\2\2\2\u038a\u038b\3\2\2\2\u038b\u038c\3\2\2\2\u038c"+
+ "\u038d\bp\2\2\u038d\u00e0\3\2\2\2\u038e\u038f\13\2\2\2\u038f\u00e2\3\2"+
+ "\2\2\"\2\u02d0\u02f1\u02f3\u02fb\u0300\u0306\u030d\u0312\u0318\u031b\u0323"+
+ "\u0327\u032b\u0330\u0332\u0339\u033b\u0340\u0342\u0348\u034a\u0353\u0355"+
+ "\u035c\u0361\u036d\u0371\u0374\u037d\u037f\u038a\3\2\3\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseListener.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseListener.java
index 3bd7737aff1..4e449809cfe 100644
--- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseListener.java
+++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseListener.java
@@ -713,6 +713,16 @@ interface SqlBaseListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitCastTemplate(SqlBaseParser.CastTemplateContext ctx);
+ /**
+ * Enter a parse tree produced by {@link SqlBaseParser#convertTemplate}.
+ * @param ctx the parse tree
+ */
+ void enterConvertTemplate(SqlBaseParser.ConvertTemplateContext ctx);
+ /**
+ * Exit a parse tree produced by {@link SqlBaseParser#convertTemplate}.
+ * @param ctx the parse tree
+ */
+ void exitConvertTemplate(SqlBaseParser.ConvertTemplateContext ctx);
/**
* Enter a parse tree produced by {@link SqlBaseParser#extractExpression}.
* @param ctx the parse tree
diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseParser.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseParser.java
index 321cd058c08..4e25bd18dc9 100644
--- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseParser.java
+++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseParser.java
@@ -19,20 +19,20 @@ class SqlBaseParser extends Parser {
public static final int
T__0=1, T__1=2, T__2=3, T__3=4, ALL=5, ANALYZE=6, ANALYZED=7, AND=8, ANY=9,
AS=10, ASC=11, BETWEEN=12, BY=13, CAST=14, CATALOG=15, CATALOGS=16, COLUMNS=17,
- DEBUG=18, DESC=19, DESCRIBE=20, DISTINCT=21, ESCAPE=22, EXECUTABLE=23,
- EXISTS=24, EXPLAIN=25, EXTRACT=26, FALSE=27, FIRST=28, FORMAT=29, FROM=30,
- FULL=31, FUNCTIONS=32, GRAPHVIZ=33, GROUP=34, HAVING=35, IN=36, INNER=37,
- IS=38, JOIN=39, LAST=40, LEFT=41, LIKE=42, LIMIT=43, MAPPED=44, MATCH=45,
- NATURAL=46, NOT=47, NULL=48, NULLS=49, ON=50, OPTIMIZED=51, OR=52, ORDER=53,
- OUTER=54, PARSED=55, PHYSICAL=56, PLAN=57, RIGHT=58, RLIKE=59, QUERY=60,
- SCHEMAS=61, SELECT=62, SHOW=63, SYS=64, TABLE=65, TABLES=66, TEXT=67,
- TRUE=68, TYPE=69, TYPES=70, USING=71, VERIFY=72, WHERE=73, WITH=74, ESCAPE_ESC=75,
- FUNCTION_ESC=76, LIMIT_ESC=77, DATE_ESC=78, TIME_ESC=79, TIMESTAMP_ESC=80,
- GUID_ESC=81, ESC_END=82, EQ=83, NEQ=84, LT=85, LTE=86, GT=87, GTE=88,
- PLUS=89, MINUS=90, ASTERISK=91, SLASH=92, PERCENT=93, CONCAT=94, DOT=95,
- PARAM=96, STRING=97, INTEGER_VALUE=98, DECIMAL_VALUE=99, IDENTIFIER=100,
- DIGIT_IDENTIFIER=101, TABLE_IDENTIFIER=102, QUOTED_IDENTIFIER=103, BACKQUOTED_IDENTIFIER=104,
- SIMPLE_COMMENT=105, BRACKETED_COMMENT=106, WS=107, UNRECOGNIZED=108, DELIMITER=109;
+ CONVERT=18, DEBUG=19, DESC=20, DESCRIBE=21, DISTINCT=22, ESCAPE=23, EXECUTABLE=24,
+ EXISTS=25, EXPLAIN=26, EXTRACT=27, FALSE=28, FIRST=29, FORMAT=30, FROM=31,
+ FULL=32, FUNCTIONS=33, GRAPHVIZ=34, GROUP=35, HAVING=36, IN=37, INNER=38,
+ IS=39, JOIN=40, LAST=41, LEFT=42, LIKE=43, LIMIT=44, MAPPED=45, MATCH=46,
+ NATURAL=47, NOT=48, NULL=49, NULLS=50, ON=51, OPTIMIZED=52, OR=53, ORDER=54,
+ OUTER=55, PARSED=56, PHYSICAL=57, PLAN=58, RIGHT=59, RLIKE=60, QUERY=61,
+ SCHEMAS=62, SELECT=63, SHOW=64, SYS=65, TABLE=66, TABLES=67, TEXT=68,
+ TRUE=69, TYPE=70, TYPES=71, USING=72, VERIFY=73, WHERE=74, WITH=75, ESCAPE_ESC=76,
+ FUNCTION_ESC=77, LIMIT_ESC=78, DATE_ESC=79, TIME_ESC=80, TIMESTAMP_ESC=81,
+ GUID_ESC=82, ESC_END=83, EQ=84, NEQ=85, LT=86, LTE=87, GT=88, GTE=89,
+ PLUS=90, MINUS=91, ASTERISK=92, SLASH=93, PERCENT=94, CONCAT=95, DOT=96,
+ PARAM=97, STRING=98, INTEGER_VALUE=99, DECIMAL_VALUE=100, IDENTIFIER=101,
+ DIGIT_IDENTIFIER=102, TABLE_IDENTIFIER=103, QUOTED_IDENTIFIER=104, BACKQUOTED_IDENTIFIER=105,
+ SIMPLE_COMMENT=106, BRACKETED_COMMENT=107, WS=108, UNRECOGNIZED=109, DELIMITER=110;
public static final int
RULE_singleStatement = 0, RULE_singleExpression = 1, RULE_statement = 2,
RULE_query = 3, RULE_queryNoWith = 4, RULE_limitClause = 5, RULE_queryTerm = 6,
@@ -43,12 +43,13 @@ class SqlBaseParser extends Parser {
RULE_expression = 21, RULE_booleanExpression = 22, RULE_matchQueryOptions = 23,
RULE_predicated = 24, RULE_predicate = 25, RULE_likePattern = 26, RULE_pattern = 27,
RULE_patternEscape = 28, RULE_valueExpression = 29, RULE_primaryExpression = 30,
- RULE_castExpression = 31, RULE_castTemplate = 32, RULE_extractExpression = 33,
- RULE_extractTemplate = 34, RULE_functionExpression = 35, RULE_functionTemplate = 36,
- RULE_functionName = 37, RULE_constant = 38, RULE_comparisonOperator = 39,
- RULE_booleanValue = 40, RULE_dataType = 41, RULE_qualifiedName = 42, RULE_identifier = 43,
- RULE_tableIdentifier = 44, RULE_quoteIdentifier = 45, RULE_unquoteIdentifier = 46,
- RULE_number = 47, RULE_string = 48, RULE_nonReserved = 49;
+ RULE_castExpression = 31, RULE_castTemplate = 32, RULE_convertTemplate = 33,
+ RULE_extractExpression = 34, RULE_extractTemplate = 35, RULE_functionExpression = 36,
+ RULE_functionTemplate = 37, RULE_functionName = 38, RULE_constant = 39,
+ RULE_comparisonOperator = 40, RULE_booleanValue = 41, RULE_dataType = 42,
+ RULE_qualifiedName = 43, RULE_identifier = 44, RULE_tableIdentifier = 45,
+ RULE_quoteIdentifier = 46, RULE_unquoteIdentifier = 47, RULE_number = 48,
+ RULE_string = 49, RULE_nonReserved = 50;
public static final String[] ruleNames = {
"singleStatement", "singleExpression", "statement", "query", "queryNoWith",
"limitClause", "queryTerm", "orderBy", "querySpecification", "fromClause",
@@ -57,18 +58,18 @@ class SqlBaseParser extends Parser {
"relationPrimary", "expression", "booleanExpression", "matchQueryOptions",
"predicated", "predicate", "likePattern", "pattern", "patternEscape",
"valueExpression", "primaryExpression", "castExpression", "castTemplate",
- "extractExpression", "extractTemplate", "functionExpression", "functionTemplate",
- "functionName", "constant", "comparisonOperator", "booleanValue", "dataType",
- "qualifiedName", "identifier", "tableIdentifier", "quoteIdentifier", "unquoteIdentifier",
- "number", "string", "nonReserved"
+ "convertTemplate", "extractExpression", "extractTemplate", "functionExpression",
+ "functionTemplate", "functionName", "constant", "comparisonOperator",
+ "booleanValue", "dataType", "qualifiedName", "identifier", "tableIdentifier",
+ "quoteIdentifier", "unquoteIdentifier", "number", "string", "nonReserved"
};
private static final String[] _LITERAL_NAMES = {
null, "'('", "')'", "','", "':'", "'ALL'", "'ANALYZE'", "'ANALYZED'",
"'AND'", "'ANY'", "'AS'", "'ASC'", "'BETWEEN'", "'BY'", "'CAST'", "'CATALOG'",
- "'CATALOGS'", "'COLUMNS'", "'DEBUG'", "'DESC'", "'DESCRIBE'", "'DISTINCT'",
- "'ESCAPE'", "'EXECUTABLE'", "'EXISTS'", "'EXPLAIN'", "'EXTRACT'", "'FALSE'",
- "'FIRST'", "'FORMAT'", "'FROM'", "'FULL'", "'FUNCTIONS'", "'GRAPHVIZ'",
+ "'CATALOGS'", "'COLUMNS'", "'CONVERT'", "'DEBUG'", "'DESC'", "'DESCRIBE'",
+ "'DISTINCT'", "'ESCAPE'", "'EXECUTABLE'", "'EXISTS'", "'EXPLAIN'", "'EXTRACT'",
+ "'FALSE'", "'FIRST'", "'FORMAT'", "'FROM'", "'FULL'", "'FUNCTIONS'", "'GRAPHVIZ'",
"'GROUP'", "'HAVING'", "'IN'", "'INNER'", "'IS'", "'JOIN'", "'LAST'",
"'LEFT'", "'LIKE'", "'LIMIT'", "'MAPPED'", "'MATCH'", "'NATURAL'", "'NOT'",
"'NULL'", "'NULLS'", "'ON'", "'OPTIMIZED'", "'OR'", "'ORDER'", "'OUTER'",
@@ -82,19 +83,19 @@ class SqlBaseParser extends Parser {
private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, "ALL", "ANALYZE", "ANALYZED", "AND", "ANY",
"AS", "ASC", "BETWEEN", "BY", "CAST", "CATALOG", "CATALOGS", "COLUMNS",
- "DEBUG", "DESC", "DESCRIBE", "DISTINCT", "ESCAPE", "EXECUTABLE", "EXISTS",
- "EXPLAIN", "EXTRACT", "FALSE", "FIRST", "FORMAT", "FROM", "FULL", "FUNCTIONS",
- "GRAPHVIZ", "GROUP", "HAVING", "IN", "INNER", "IS", "JOIN", "LAST", "LEFT",
- "LIKE", "LIMIT", "MAPPED", "MATCH", "NATURAL", "NOT", "NULL", "NULLS",
- "ON", "OPTIMIZED", "OR", "ORDER", "OUTER", "PARSED", "PHYSICAL", "PLAN",
- "RIGHT", "RLIKE", "QUERY", "SCHEMAS", "SELECT", "SHOW", "SYS", "TABLE",
- "TABLES", "TEXT", "TRUE", "TYPE", "TYPES", "USING", "VERIFY", "WHERE",
- "WITH", "ESCAPE_ESC", "FUNCTION_ESC", "LIMIT_ESC", "DATE_ESC", "TIME_ESC",
- "TIMESTAMP_ESC", "GUID_ESC", "ESC_END", "EQ", "NEQ", "LT", "LTE", "GT",
- "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "CONCAT", "DOT",
- "PARAM", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE", "IDENTIFIER", "DIGIT_IDENTIFIER",
- "TABLE_IDENTIFIER", "QUOTED_IDENTIFIER", "BACKQUOTED_IDENTIFIER", "SIMPLE_COMMENT",
- "BRACKETED_COMMENT", "WS", "UNRECOGNIZED", "DELIMITER"
+ "CONVERT", "DEBUG", "DESC", "DESCRIBE", "DISTINCT", "ESCAPE", "EXECUTABLE",
+ "EXISTS", "EXPLAIN", "EXTRACT", "FALSE", "FIRST", "FORMAT", "FROM", "FULL",
+ "FUNCTIONS", "GRAPHVIZ", "GROUP", "HAVING", "IN", "INNER", "IS", "JOIN",
+ "LAST", "LEFT", "LIKE", "LIMIT", "MAPPED", "MATCH", "NATURAL", "NOT",
+ "NULL", "NULLS", "ON", "OPTIMIZED", "OR", "ORDER", "OUTER", "PARSED",
+ "PHYSICAL", "PLAN", "RIGHT", "RLIKE", "QUERY", "SCHEMAS", "SELECT", "SHOW",
+ "SYS", "TABLE", "TABLES", "TEXT", "TRUE", "TYPE", "TYPES", "USING", "VERIFY",
+ "WHERE", "WITH", "ESCAPE_ESC", "FUNCTION_ESC", "LIMIT_ESC", "DATE_ESC",
+ "TIME_ESC", "TIMESTAMP_ESC", "GUID_ESC", "ESC_END", "EQ", "NEQ", "LT",
+ "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "CONCAT",
+ "DOT", "PARAM", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE", "IDENTIFIER",
+ "DIGIT_IDENTIFIER", "TABLE_IDENTIFIER", "QUOTED_IDENTIFIER", "BACKQUOTED_IDENTIFIER",
+ "SIMPLE_COMMENT", "BRACKETED_COMMENT", "WS", "UNRECOGNIZED", "DELIMITER"
};
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@@ -175,9 +176,9 @@ class SqlBaseParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(100);
+ setState(102);
statement();
- setState(101);
+ setState(103);
match(EOF);
}
}
@@ -222,9 +223,9 @@ class SqlBaseParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(103);
+ setState(105);
expression();
- setState(104);
+ setState(106);
match(EOF);
}
}
@@ -618,14 +619,14 @@ class SqlBaseParser extends Parser {
enterRule(_localctx, 4, RULE_statement);
int _la;
try {
- setState(206);
+ setState(208);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,17,_ctx) ) {
case 1:
_localctx = new StatementDefaultContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(106);
+ setState(108);
query();
}
break;
@@ -633,27 +634,27 @@ class SqlBaseParser extends Parser {
_localctx = new ExplainContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(107);
+ setState(109);
match(EXPLAIN);
- setState(121);
+ setState(123);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) {
case 1:
{
- setState(108);
+ setState(110);
match(T__0);
- setState(117);
+ setState(119);
_errHandler.sync(this);
_la = _input.LA(1);
- while (((((_la - 29)) & ~0x3f) == 0 && ((1L << (_la - 29)) & ((1L << (FORMAT - 29)) | (1L << (PLAN - 29)) | (1L << (VERIFY - 29)))) != 0)) {
+ while (((((_la - 30)) & ~0x3f) == 0 && ((1L << (_la - 30)) & ((1L << (FORMAT - 30)) | (1L << (PLAN - 30)) | (1L << (VERIFY - 30)))) != 0)) {
{
- setState(115);
+ setState(117);
switch (_input.LA(1)) {
case PLAN:
{
- setState(109);
+ setState(111);
match(PLAN);
- setState(110);
+ setState(112);
((ExplainContext)_localctx).type = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ALL) | (1L << ANALYZED) | (1L << EXECUTABLE) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED))) != 0)) ) {
@@ -665,9 +666,9 @@ class SqlBaseParser extends Parser {
break;
case FORMAT:
{
- setState(111);
+ setState(113);
match(FORMAT);
- setState(112);
+ setState(114);
((ExplainContext)_localctx).format = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==GRAPHVIZ || _la==TEXT) ) {
@@ -679,9 +680,9 @@ class SqlBaseParser extends Parser {
break;
case VERIFY:
{
- setState(113);
+ setState(115);
match(VERIFY);
- setState(114);
+ setState(116);
((ExplainContext)_localctx).verify = booleanValue();
}
break;
@@ -689,16 +690,16 @@ class SqlBaseParser extends Parser {
throw new NoViableAltException(this);
}
}
- setState(119);
+ setState(121);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(120);
+ setState(122);
match(T__1);
}
break;
}
- setState(123);
+ setState(125);
statement();
}
break;
@@ -706,27 +707,27 @@ class SqlBaseParser extends Parser {
_localctx = new DebugContext(_localctx);
enterOuterAlt(_localctx, 3);
{
- setState(124);
+ setState(126);
match(DEBUG);
- setState(136);
+ setState(138);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) {
case 1:
{
- setState(125);
+ setState(127);
match(T__0);
- setState(132);
+ setState(134);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==FORMAT || _la==PLAN) {
{
- setState(130);
+ setState(132);
switch (_input.LA(1)) {
case PLAN:
{
- setState(126);
+ setState(128);
match(PLAN);
- setState(127);
+ setState(129);
((DebugContext)_localctx).type = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==ANALYZED || _la==OPTIMIZED) ) {
@@ -738,9 +739,9 @@ class SqlBaseParser extends Parser {
break;
case FORMAT:
{
- setState(128);
+ setState(130);
match(FORMAT);
- setState(129);
+ setState(131);
((DebugContext)_localctx).format = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==GRAPHVIZ || _la==TEXT) ) {
@@ -754,16 +755,16 @@ class SqlBaseParser extends Parser {
throw new NoViableAltException(this);
}
}
- setState(134);
+ setState(136);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(135);
+ setState(137);
match(T__1);
}
break;
}
- setState(138);
+ setState(140);
statement();
}
break;
@@ -771,15 +772,15 @@ class SqlBaseParser extends Parser {
_localctx = new ShowTablesContext(_localctx);
enterOuterAlt(_localctx, 4);
{
- setState(139);
+ setState(141);
match(SHOW);
- setState(140);
+ setState(142);
match(TABLES);
- setState(143);
+ setState(145);
switch (_input.LA(1)) {
case LIKE:
{
- setState(141);
+ setState(143);
((ShowTablesContext)_localctx).tableLike = likePattern();
}
break;
@@ -814,7 +815,7 @@ class SqlBaseParser extends Parser {
case QUOTED_IDENTIFIER:
case BACKQUOTED_IDENTIFIER:
{
- setState(142);
+ setState(144);
((ShowTablesContext)_localctx).tableIdent = tableIdentifier();
}
break;
@@ -829,22 +830,22 @@ class SqlBaseParser extends Parser {
_localctx = new ShowColumnsContext(_localctx);
enterOuterAlt(_localctx, 5);
{
- setState(145);
- match(SHOW);
- setState(146);
- match(COLUMNS);
setState(147);
+ match(SHOW);
+ setState(148);
+ match(COLUMNS);
+ setState(149);
_la = _input.LA(1);
if ( !(_la==FROM || _la==IN) ) {
_errHandler.recoverInline(this);
} else {
consume();
}
- setState(150);
+ setState(152);
switch (_input.LA(1)) {
case LIKE:
{
- setState(148);
+ setState(150);
((ShowColumnsContext)_localctx).tableLike = likePattern();
}
break;
@@ -879,7 +880,7 @@ class SqlBaseParser extends Parser {
case QUOTED_IDENTIFIER:
case BACKQUOTED_IDENTIFIER:
{
- setState(149);
+ setState(151);
((ShowColumnsContext)_localctx).tableIdent = tableIdentifier();
}
break;
@@ -892,18 +893,18 @@ class SqlBaseParser extends Parser {
_localctx = new ShowColumnsContext(_localctx);
enterOuterAlt(_localctx, 6);
{
- setState(152);
+ setState(154);
_la = _input.LA(1);
if ( !(_la==DESC || _la==DESCRIBE) ) {
_errHandler.recoverInline(this);
} else {
consume();
}
- setState(155);
+ setState(157);
switch (_input.LA(1)) {
case LIKE:
{
- setState(153);
+ setState(155);
((ShowColumnsContext)_localctx).tableLike = likePattern();
}
break;
@@ -938,7 +939,7 @@ class SqlBaseParser extends Parser {
case QUOTED_IDENTIFIER:
case BACKQUOTED_IDENTIFIER:
{
- setState(154);
+ setState(156);
((ShowColumnsContext)_localctx).tableIdent = tableIdentifier();
}
break;
@@ -951,15 +952,15 @@ class SqlBaseParser extends Parser {
_localctx = new ShowFunctionsContext(_localctx);
enterOuterAlt(_localctx, 7);
{
- setState(157);
+ setState(159);
match(SHOW);
- setState(158);
- match(FUNCTIONS);
setState(160);
+ match(FUNCTIONS);
+ setState(162);
_la = _input.LA(1);
if (_la==LIKE) {
{
- setState(159);
+ setState(161);
likePattern();
}
}
@@ -970,9 +971,9 @@ class SqlBaseParser extends Parser {
_localctx = new ShowSchemasContext(_localctx);
enterOuterAlt(_localctx, 8);
{
- setState(162);
+ setState(164);
match(SHOW);
- setState(163);
+ setState(165);
match(SCHEMAS);
}
break;
@@ -980,9 +981,9 @@ class SqlBaseParser extends Parser {
_localctx = new SysCatalogsContext(_localctx);
enterOuterAlt(_localctx, 9);
{
- setState(164);
+ setState(166);
match(SYS);
- setState(165);
+ setState(167);
match(CATALOGS);
}
break;
@@ -990,58 +991,58 @@ class SqlBaseParser extends Parser {
_localctx = new SysTablesContext(_localctx);
enterOuterAlt(_localctx, 10);
{
- setState(166);
+ setState(168);
match(SYS);
- setState(167);
+ setState(169);
match(TABLES);
- setState(170);
+ setState(172);
_la = _input.LA(1);
if (_la==CATALOG) {
{
- setState(168);
+ setState(170);
match(CATALOG);
- setState(169);
+ setState(171);
((SysTablesContext)_localctx).clusterLike = likePattern();
}
}
- setState(174);
+ setState(176);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) {
case 1:
{
- setState(172);
+ setState(174);
((SysTablesContext)_localctx).tableLike = likePattern();
}
break;
case 2:
{
- setState(173);
+ setState(175);
((SysTablesContext)_localctx).tableIdent = tableIdentifier();
}
break;
}
- setState(185);
+ setState(187);
_la = _input.LA(1);
if (_la==TYPE) {
{
- setState(176);
+ setState(178);
match(TYPE);
- setState(177);
+ setState(179);
string();
- setState(182);
+ setState(184);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__2) {
{
{
- setState(178);
+ setState(180);
match(T__2);
- setState(179);
+ setState(181);
string();
}
}
- setState(184);
+ setState(186);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -1054,28 +1055,28 @@ class SqlBaseParser extends Parser {
_localctx = new SysColumnsContext(_localctx);
enterOuterAlt(_localctx, 11);
{
- setState(187);
+ setState(189);
match(SYS);
- setState(188);
+ setState(190);
match(COLUMNS);
- setState(191);
+ setState(193);
_la = _input.LA(1);
if (_la==CATALOG) {
{
- setState(189);
+ setState(191);
match(CATALOG);
- setState(190);
+ setState(192);
((SysColumnsContext)_localctx).cluster = string();
}
}
- setState(196);
+ setState(198);
switch (_input.LA(1)) {
case TABLE:
{
- setState(193);
+ setState(195);
match(TABLE);
- setState(194);
+ setState(196);
((SysColumnsContext)_localctx).tableLike = likePattern();
}
break;
@@ -1110,7 +1111,7 @@ class SqlBaseParser extends Parser {
case QUOTED_IDENTIFIER:
case BACKQUOTED_IDENTIFIER:
{
- setState(195);
+ setState(197);
((SysColumnsContext)_localctx).tableIdent = tableIdentifier();
}
break;
@@ -1120,11 +1121,11 @@ class SqlBaseParser extends Parser {
default:
throw new NoViableAltException(this);
}
- setState(199);
+ setState(201);
_la = _input.LA(1);
if (_la==LIKE) {
{
- setState(198);
+ setState(200);
((SysColumnsContext)_localctx).columnPattern = likePattern();
}
}
@@ -1135,9 +1136,9 @@ class SqlBaseParser extends Parser {
_localctx = new SysTypesContext(_localctx);
enterOuterAlt(_localctx, 12);
{
- setState(201);
+ setState(203);
match(SYS);
- setState(202);
+ setState(204);
match(TYPES);
}
break;
@@ -1145,11 +1146,11 @@ class SqlBaseParser extends Parser {
_localctx = new SysTableTypesContext(_localctx);
enterOuterAlt(_localctx, 13);
{
- setState(203);
- match(SYS);
- setState(204);
- match(TABLE);
setState(205);
+ match(SYS);
+ setState(206);
+ match(TABLE);
+ setState(207);
match(TYPES);
}
break;
@@ -1203,34 +1204,34 @@ class SqlBaseParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(217);
+ setState(219);
_la = _input.LA(1);
if (_la==WITH) {
{
- setState(208);
+ setState(210);
match(WITH);
- setState(209);
+ setState(211);
namedQuery();
- setState(214);
+ setState(216);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__2) {
{
{
- setState(210);
+ setState(212);
match(T__2);
- setState(211);
+ setState(213);
namedQuery();
}
}
- setState(216);
+ setState(218);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
}
- setState(219);
+ setState(221);
queryNoWith();
}
}
@@ -1286,42 +1287,42 @@ class SqlBaseParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(221);
+ setState(223);
queryTerm();
- setState(232);
+ setState(234);
_la = _input.LA(1);
if (_la==ORDER) {
{
- setState(222);
- match(ORDER);
- setState(223);
- match(BY);
setState(224);
+ match(ORDER);
+ setState(225);
+ match(BY);
+ setState(226);
orderBy();
- setState(229);
+ setState(231);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__2) {
{
{
- setState(225);
+ setState(227);
match(T__2);
- setState(226);
+ setState(228);
orderBy();
}
}
- setState(231);
+ setState(233);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
}
- setState(235);
+ setState(237);
_la = _input.LA(1);
if (_la==LIMIT || _la==LIMIT_ESC) {
{
- setState(234);
+ setState(236);
limitClause();
}
}
@@ -1370,14 +1371,14 @@ class SqlBaseParser extends Parser {
enterRule(_localctx, 10, RULE_limitClause);
int _la;
try {
- setState(242);
+ setState(244);
switch (_input.LA(1)) {
case LIMIT:
enterOuterAlt(_localctx, 1);
{
- setState(237);
+ setState(239);
match(LIMIT);
- setState(238);
+ setState(240);
((LimitClauseContext)_localctx).limit = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==ALL || _la==INTEGER_VALUE) ) {
@@ -1390,9 +1391,9 @@ class SqlBaseParser extends Parser {
case LIMIT_ESC:
enterOuterAlt(_localctx, 2);
{
- setState(239);
+ setState(241);
match(LIMIT_ESC);
- setState(240);
+ setState(242);
((LimitClauseContext)_localctx).limit = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==ALL || _la==INTEGER_VALUE) ) {
@@ -1400,7 +1401,7 @@ class SqlBaseParser extends Parser {
} else {
consume();
}
- setState(241);
+ setState(243);
match(ESC_END);
}
break;
@@ -1473,13 +1474,13 @@ class SqlBaseParser extends Parser {
QueryTermContext _localctx = new QueryTermContext(_ctx, getState());
enterRule(_localctx, 12, RULE_queryTerm);
try {
- setState(249);
+ setState(251);
switch (_input.LA(1)) {
case SELECT:
_localctx = new QueryPrimaryDefaultContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(244);
+ setState(246);
querySpecification();
}
break;
@@ -1487,11 +1488,11 @@ class SqlBaseParser extends Parser {
_localctx = new SubqueryContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(245);
- match(T__0);
- setState(246);
- queryNoWith();
setState(247);
+ match(T__0);
+ setState(248);
+ queryNoWith();
+ setState(249);
match(T__1);
}
break;
@@ -1547,13 +1548,13 @@ class SqlBaseParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(251);
- expression();
setState(253);
+ expression();
+ setState(255);
_la = _input.LA(1);
if (_la==ASC || _la==DESC) {
{
- setState(252);
+ setState(254);
((OrderByContext)_localctx).ordering = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==ASC || _la==DESC) ) {
@@ -1564,13 +1565,13 @@ class SqlBaseParser extends Parser {
}
}
- setState(257);
+ setState(259);
_la = _input.LA(1);
if (_la==NULLS) {
{
- setState(255);
+ setState(257);
match(NULLS);
- setState(256);
+ setState(258);
((OrderByContext)_localctx).nullOrdering = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==FIRST || _la==LAST) ) {
@@ -1649,75 +1650,75 @@ class SqlBaseParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(259);
- match(SELECT);
setState(261);
+ match(SELECT);
+ setState(263);
_la = _input.LA(1);
if (_la==ALL || _la==DISTINCT) {
{
- setState(260);
+ setState(262);
setQuantifier();
}
}
- setState(263);
+ setState(265);
selectItem();
- setState(268);
+ setState(270);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__2) {
{
{
- setState(264);
+ setState(266);
match(T__2);
- setState(265);
+ setState(267);
selectItem();
}
}
- setState(270);
+ setState(272);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(272);
+ setState(274);
_la = _input.LA(1);
if (_la==FROM) {
{
- setState(271);
+ setState(273);
fromClause();
}
}
- setState(276);
+ setState(278);
_la = _input.LA(1);
if (_la==WHERE) {
{
- setState(274);
+ setState(276);
match(WHERE);
- setState(275);
+ setState(277);
((QuerySpecificationContext)_localctx).where = booleanExpression(0);
}
}
- setState(281);
+ setState(283);
_la = _input.LA(1);
if (_la==GROUP) {
{
- setState(278);
- match(GROUP);
- setState(279);
- match(BY);
setState(280);
+ match(GROUP);
+ setState(281);
+ match(BY);
+ setState(282);
groupBy();
}
}
- setState(285);
+ setState(287);
_la = _input.LA(1);
if (_la==HAVING) {
{
- setState(283);
+ setState(285);
match(HAVING);
- setState(284);
+ setState(286);
((QuerySpecificationContext)_localctx).having = booleanExpression(0);
}
}
@@ -1769,23 +1770,23 @@ class SqlBaseParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(287);
+ setState(289);
match(FROM);
- setState(288);
+ setState(290);
relation();
- setState(293);
+ setState(295);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__2) {
{
{
- setState(289);
+ setState(291);
match(T__2);
- setState(290);
+ setState(292);
relation();
}
}
- setState(295);
+ setState(297);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -1838,30 +1839,30 @@ class SqlBaseParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(297);
+ setState(299);
_la = _input.LA(1);
if (_la==ALL || _la==DISTINCT) {
{
- setState(296);
+ setState(298);
setQuantifier();
}
}
- setState(299);
+ setState(301);
groupingElement();
- setState(304);
+ setState(306);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__2) {
{
{
- setState(300);
+ setState(302);
match(T__2);
- setState(301);
+ setState(303);
groupingElement();
}
}
- setState(306);
+ setState(308);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -1916,7 +1917,7 @@ class SqlBaseParser extends Parser {
_localctx = new SingleGroupingSetContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(307);
+ setState(309);
groupingExpressions();
}
}
@@ -1962,47 +1963,47 @@ class SqlBaseParser extends Parser {
enterRule(_localctx, 24, RULE_groupingExpressions);
int _la;
try {
- setState(322);
+ setState(324);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(309);
+ setState(311);
match(T__0);
- setState(318);
+ setState(320);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CAST) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << LEFT) | (1L << MAPPED) | (1L << MATCH) | (1L << NOT) | (1L << NULL) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RIGHT) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (SYS - 64)) | (1L << (TABLES - 64)) | (1L << (TEXT - 64)) | (1L << (TRUE - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (FUNCTION_ESC - 64)) | (1L << (DATE_ESC - 64)) | (1L << (TIME_ESC - 64)) | (1L << (TIMESTAMP_ESC - 64)) | (1L << (GUID_ESC - 64)) | (1L << (PLUS - 64)) | (1L << (MINUS - 64)) | (1L << (ASTERISK - 64)) | (1L << (PARAM - 64)) | (1L << (STRING - 64)) | (1L << (INTEGER_VALUE - 64)) | (1L << (DECIMAL_VALUE - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CAST) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << CONVERT) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << LEFT) | (1L << MAPPED) | (1L << MATCH) | (1L << NOT) | (1L << NULL) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RIGHT) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (SHOW - 64)) | (1L << (SYS - 64)) | (1L << (TABLES - 64)) | (1L << (TEXT - 64)) | (1L << (TRUE - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (FUNCTION_ESC - 64)) | (1L << (DATE_ESC - 64)) | (1L << (TIME_ESC - 64)) | (1L << (TIMESTAMP_ESC - 64)) | (1L << (GUID_ESC - 64)) | (1L << (PLUS - 64)) | (1L << (MINUS - 64)) | (1L << (ASTERISK - 64)) | (1L << (PARAM - 64)) | (1L << (STRING - 64)) | (1L << (INTEGER_VALUE - 64)) | (1L << (DECIMAL_VALUE - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
{
- setState(310);
+ setState(312);
expression();
- setState(315);
+ setState(317);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__2) {
{
{
- setState(311);
+ setState(313);
match(T__2);
- setState(312);
+ setState(314);
expression();
}
}
- setState(317);
+ setState(319);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
}
- setState(320);
+ setState(322);
match(T__1);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(321);
+ setState(323);
expression();
}
break;
@@ -2053,15 +2054,15 @@ class SqlBaseParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(324);
- ((NamedQueryContext)_localctx).name = identifier();
- setState(325);
- match(AS);
setState(326);
- match(T__0);
+ ((NamedQueryContext)_localctx).name = identifier();
setState(327);
- queryNoWith();
+ match(AS);
setState(328);
+ match(T__0);
+ setState(329);
+ queryNoWith();
+ setState(330);
match(T__1);
}
}
@@ -2105,7 +2106,7 @@ class SqlBaseParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(330);
+ setState(332);
_la = _input.LA(1);
if ( !(_la==ALL || _la==DISTINCT) ) {
_errHandler.recoverInline(this);
@@ -2168,22 +2169,22 @@ class SqlBaseParser extends Parser {
_localctx = new SelectExpressionContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(332);
+ setState(334);
expression();
- setState(337);
+ setState(339);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (SYS - 64)) | (1L << (TABLES - 64)) | (1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (SHOW - 64)) | (1L << (SYS - 64)) | (1L << (TABLES - 64)) | (1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
{
- setState(334);
+ setState(336);
_la = _input.LA(1);
if (_la==AS) {
{
- setState(333);
+ setState(335);
match(AS);
}
}
- setState(336);
+ setState(338);
identifier();
}
}
@@ -2237,19 +2238,19 @@ class SqlBaseParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(339);
+ setState(341);
relationPrimary();
- setState(343);
+ setState(345);
_errHandler.sync(this);
_la = _input.LA(1);
while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FULL) | (1L << INNER) | (1L << JOIN) | (1L << LEFT) | (1L << NATURAL) | (1L << RIGHT))) != 0)) {
{
{
- setState(340);
+ setState(342);
joinRelation();
}
}
- setState(345);
+ setState(347);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -2303,7 +2304,7 @@ class SqlBaseParser extends Parser {
enterRule(_localctx, 34, RULE_joinRelation);
int _la;
try {
- setState(357);
+ setState(359);
switch (_input.LA(1)) {
case FULL:
case INNER:
@@ -2313,18 +2314,18 @@ class SqlBaseParser extends Parser {
enterOuterAlt(_localctx, 1);
{
{
- setState(346);
+ setState(348);
joinType();
}
- setState(347);
+ setState(349);
match(JOIN);
- setState(348);
- ((JoinRelationContext)_localctx).right = relationPrimary();
setState(350);
+ ((JoinRelationContext)_localctx).right = relationPrimary();
+ setState(352);
_la = _input.LA(1);
if (_la==ON || _la==USING) {
{
- setState(349);
+ setState(351);
joinCriteria();
}
}
@@ -2334,13 +2335,13 @@ class SqlBaseParser extends Parser {
case NATURAL:
enterOuterAlt(_localctx, 2);
{
- setState(352);
- match(NATURAL);
- setState(353);
- joinType();
setState(354);
- match(JOIN);
+ match(NATURAL);
setState(355);
+ joinType();
+ setState(356);
+ match(JOIN);
+ setState(357);
((JoinRelationContext)_localctx).right = relationPrimary();
}
break;
@@ -2389,17 +2390,17 @@ class SqlBaseParser extends Parser {
enterRule(_localctx, 36, RULE_joinType);
int _la;
try {
- setState(374);
+ setState(376);
switch (_input.LA(1)) {
case INNER:
case JOIN:
enterOuterAlt(_localctx, 1);
{
- setState(360);
+ setState(362);
_la = _input.LA(1);
if (_la==INNER) {
{
- setState(359);
+ setState(361);
match(INNER);
}
}
@@ -2409,13 +2410,13 @@ class SqlBaseParser extends Parser {
case LEFT:
enterOuterAlt(_localctx, 2);
{
- setState(362);
- match(LEFT);
setState(364);
+ match(LEFT);
+ setState(366);
_la = _input.LA(1);
if (_la==OUTER) {
{
- setState(363);
+ setState(365);
match(OUTER);
}
}
@@ -2425,13 +2426,13 @@ class SqlBaseParser extends Parser {
case RIGHT:
enterOuterAlt(_localctx, 3);
{
- setState(366);
- match(RIGHT);
setState(368);
+ match(RIGHT);
+ setState(370);
_la = _input.LA(1);
if (_la==OUTER) {
{
- setState(367);
+ setState(369);
match(OUTER);
}
}
@@ -2441,13 +2442,13 @@ class SqlBaseParser extends Parser {
case FULL:
enterOuterAlt(_localctx, 4);
{
- setState(370);
- match(FULL);
setState(372);
+ match(FULL);
+ setState(374);
_la = _input.LA(1);
if (_la==OUTER) {
{
- setState(371);
+ setState(373);
match(OUTER);
}
}
@@ -2505,43 +2506,43 @@ class SqlBaseParser extends Parser {
enterRule(_localctx, 38, RULE_joinCriteria);
int _la;
try {
- setState(390);
+ setState(392);
switch (_input.LA(1)) {
case ON:
enterOuterAlt(_localctx, 1);
{
- setState(376);
+ setState(378);
match(ON);
- setState(377);
+ setState(379);
booleanExpression(0);
}
break;
case USING:
enterOuterAlt(_localctx, 2);
{
- setState(378);
- match(USING);
- setState(379);
- match(T__0);
setState(380);
+ match(USING);
+ setState(381);
+ match(T__0);
+ setState(382);
identifier();
- setState(385);
+ setState(387);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__2) {
{
{
- setState(381);
+ setState(383);
match(T__2);
- setState(382);
+ setState(384);
identifier();
}
}
- setState(387);
+ setState(389);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(388);
+ setState(390);
match(T__1);
}
break;
@@ -2646,29 +2647,29 @@ class SqlBaseParser extends Parser {
enterRule(_localctx, 40, RULE_relationPrimary);
int _la;
try {
- setState(417);
+ setState(419);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) {
case 1:
_localctx = new TableNameContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(392);
+ setState(394);
tableIdentifier();
- setState(397);
+ setState(399);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (SYS - 64)) | (1L << (TABLES - 64)) | (1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (SHOW - 64)) | (1L << (SYS - 64)) | (1L << (TABLES - 64)) | (1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
{
- setState(394);
+ setState(396);
_la = _input.LA(1);
if (_la==AS) {
{
- setState(393);
+ setState(395);
match(AS);
}
}
- setState(396);
+ setState(398);
qualifiedName();
}
}
@@ -2679,26 +2680,26 @@ class SqlBaseParser extends Parser {
_localctx = new AliasedQueryContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(399);
- match(T__0);
- setState(400);
- queryNoWith();
setState(401);
+ match(T__0);
+ setState(402);
+ queryNoWith();
+ setState(403);
match(T__1);
- setState(406);
+ setState(408);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (SYS - 64)) | (1L << (TABLES - 64)) | (1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (SHOW - 64)) | (1L << (SYS - 64)) | (1L << (TABLES - 64)) | (1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
{
- setState(403);
+ setState(405);
_la = _input.LA(1);
if (_la==AS) {
{
- setState(402);
+ setState(404);
match(AS);
}
}
- setState(405);
+ setState(407);
qualifiedName();
}
}
@@ -2709,26 +2710,26 @@ class SqlBaseParser extends Parser {
_localctx = new AliasedRelationContext(_localctx);
enterOuterAlt(_localctx, 3);
{
- setState(408);
- match(T__0);
- setState(409);
- relation();
setState(410);
+ match(T__0);
+ setState(411);
+ relation();
+ setState(412);
match(T__1);
- setState(415);
+ setState(417);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (SYS - 64)) | (1L << (TABLES - 64)) | (1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (SHOW - 64)) | (1L << (SYS - 64)) | (1L << (TABLES - 64)) | (1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
{
- setState(412);
+ setState(414);
_la = _input.LA(1);
if (_la==AS) {
{
- setState(411);
+ setState(413);
match(AS);
}
}
- setState(414);
+ setState(416);
qualifiedName();
}
}
@@ -2777,7 +2778,7 @@ class SqlBaseParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(419);
+ setState(421);
booleanExpression(0);
}
}
@@ -2985,7 +2986,7 @@ class SqlBaseParser extends Parser {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(452);
+ setState(454);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) {
case 1:
@@ -2994,9 +2995,9 @@ class SqlBaseParser extends Parser {
_ctx = _localctx;
_prevctx = _localctx;
- setState(422);
+ setState(424);
match(NOT);
- setState(423);
+ setState(425);
booleanExpression(8);
}
break;
@@ -3005,13 +3006,13 @@ class SqlBaseParser extends Parser {
_localctx = new ExistsContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(424);
- match(EXISTS);
- setState(425);
- match(T__0);
setState(426);
- query();
+ match(EXISTS);
setState(427);
+ match(T__0);
+ setState(428);
+ query();
+ setState(429);
match(T__1);
}
break;
@@ -3020,15 +3021,15 @@ class SqlBaseParser extends Parser {
_localctx = new StringQueryContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(429);
- match(QUERY);
- setState(430);
- match(T__0);
setState(431);
- ((StringQueryContext)_localctx).queryString = string();
+ match(QUERY);
setState(432);
- matchQueryOptions();
+ match(T__0);
setState(433);
+ ((StringQueryContext)_localctx).queryString = string();
+ setState(434);
+ matchQueryOptions();
+ setState(435);
match(T__1);
}
break;
@@ -3037,19 +3038,19 @@ class SqlBaseParser extends Parser {
_localctx = new MatchQueryContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(435);
- match(MATCH);
- setState(436);
- match(T__0);
setState(437);
- ((MatchQueryContext)_localctx).singleField = qualifiedName();
+ match(MATCH);
setState(438);
- match(T__2);
+ match(T__0);
setState(439);
- ((MatchQueryContext)_localctx).queryString = string();
+ ((MatchQueryContext)_localctx).singleField = qualifiedName();
setState(440);
- matchQueryOptions();
+ match(T__2);
setState(441);
+ ((MatchQueryContext)_localctx).queryString = string();
+ setState(442);
+ matchQueryOptions();
+ setState(443);
match(T__1);
}
break;
@@ -3058,19 +3059,19 @@ class SqlBaseParser extends Parser {
_localctx = new MultiMatchQueryContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(443);
- match(MATCH);
- setState(444);
- match(T__0);
setState(445);
- ((MultiMatchQueryContext)_localctx).multiFields = string();
+ match(MATCH);
setState(446);
- match(T__2);
+ match(T__0);
setState(447);
- ((MultiMatchQueryContext)_localctx).queryString = string();
+ ((MultiMatchQueryContext)_localctx).multiFields = string();
setState(448);
- matchQueryOptions();
+ match(T__2);
setState(449);
+ ((MultiMatchQueryContext)_localctx).queryString = string();
+ setState(450);
+ matchQueryOptions();
+ setState(451);
match(T__1);
}
break;
@@ -3079,13 +3080,13 @@ class SqlBaseParser extends Parser {
_localctx = new BooleanDefaultContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(451);
+ setState(453);
predicated();
}
break;
}
_ctx.stop = _input.LT(-1);
- setState(462);
+ setState(464);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,60,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
@@ -3093,7 +3094,7 @@ class SqlBaseParser extends Parser {
if ( _parseListeners!=null ) triggerExitRuleEvent();
_prevctx = _localctx;
{
- setState(460);
+ setState(462);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) {
case 1:
@@ -3101,11 +3102,11 @@ class SqlBaseParser extends Parser {
_localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState));
((LogicalBinaryContext)_localctx).left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression);
- setState(454);
- if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)");
- setState(455);
- ((LogicalBinaryContext)_localctx).operator = match(AND);
setState(456);
+ if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)");
+ setState(457);
+ ((LogicalBinaryContext)_localctx).operator = match(AND);
+ setState(458);
((LogicalBinaryContext)_localctx).right = booleanExpression(3);
}
break;
@@ -3114,18 +3115,18 @@ class SqlBaseParser extends Parser {
_localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState));
((LogicalBinaryContext)_localctx).left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression);
- setState(457);
- if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
- setState(458);
- ((LogicalBinaryContext)_localctx).operator = match(OR);
setState(459);
+ if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
+ setState(460);
+ ((LogicalBinaryContext)_localctx).operator = match(OR);
+ setState(461);
((LogicalBinaryContext)_localctx).right = booleanExpression(2);
}
break;
}
}
}
- setState(464);
+ setState(466);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,60,_ctx);
}
@@ -3175,19 +3176,19 @@ class SqlBaseParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(469);
+ setState(471);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__2) {
{
{
- setState(465);
+ setState(467);
match(T__2);
- setState(466);
+ setState(468);
string();
}
}
- setState(471);
+ setState(473);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -3236,14 +3237,14 @@ class SqlBaseParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(472);
- valueExpression(0);
setState(474);
+ valueExpression(0);
+ setState(476);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,62,_ctx) ) {
case 1:
{
- setState(473);
+ setState(475);
predicate();
}
break;
@@ -3319,142 +3320,142 @@ class SqlBaseParser extends Parser {
enterRule(_localctx, 50, RULE_predicate);
int _la;
try {
- setState(522);
+ setState(524);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(477);
+ setState(479);
_la = _input.LA(1);
if (_la==NOT) {
{
- setState(476);
+ setState(478);
match(NOT);
}
}
- setState(479);
- ((PredicateContext)_localctx).kind = match(BETWEEN);
- setState(480);
- ((PredicateContext)_localctx).lower = valueExpression(0);
setState(481);
- match(AND);
+ ((PredicateContext)_localctx).kind = match(BETWEEN);
setState(482);
+ ((PredicateContext)_localctx).lower = valueExpression(0);
+ setState(483);
+ match(AND);
+ setState(484);
((PredicateContext)_localctx).upper = valueExpression(0);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(485);
+ setState(487);
_la = _input.LA(1);
if (_la==NOT) {
{
- setState(484);
+ setState(486);
match(NOT);
}
}
- setState(487);
- ((PredicateContext)_localctx).kind = match(IN);
- setState(488);
- match(T__0);
setState(489);
+ ((PredicateContext)_localctx).kind = match(IN);
+ setState(490);
+ match(T__0);
+ setState(491);
expression();
- setState(494);
+ setState(496);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__2) {
{
{
- setState(490);
+ setState(492);
match(T__2);
- setState(491);
+ setState(493);
expression();
}
}
- setState(496);
+ setState(498);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(497);
+ setState(499);
match(T__1);
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(500);
+ setState(502);
_la = _input.LA(1);
if (_la==NOT) {
{
- setState(499);
+ setState(501);
match(NOT);
}
}
- setState(502);
- ((PredicateContext)_localctx).kind = match(IN);
- setState(503);
- match(T__0);
setState(504);
- query();
+ ((PredicateContext)_localctx).kind = match(IN);
setState(505);
+ match(T__0);
+ setState(506);
+ query();
+ setState(507);
match(T__1);
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(508);
+ setState(510);
_la = _input.LA(1);
if (_la==NOT) {
{
- setState(507);
+ setState(509);
match(NOT);
}
}
- setState(510);
+ setState(512);
((PredicateContext)_localctx).kind = match(LIKE);
- setState(511);
+ setState(513);
pattern();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(513);
+ setState(515);
_la = _input.LA(1);
if (_la==NOT) {
{
- setState(512);
+ setState(514);
match(NOT);
}
}
- setState(515);
+ setState(517);
((PredicateContext)_localctx).kind = match(RLIKE);
- setState(516);
+ setState(518);
((PredicateContext)_localctx).regex = string();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(517);
- match(IS);
setState(519);
+ match(IS);
+ setState(521);
_la = _input.LA(1);
if (_la==NOT) {
{
- setState(518);
+ setState(520);
match(NOT);
}
}
- setState(521);
+ setState(523);
((PredicateContext)_localctx).kind = match(NULL);
}
break;
@@ -3501,9 +3502,9 @@ class SqlBaseParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(524);
+ setState(526);
match(LIKE);
- setState(525);
+ setState(527);
pattern();
}
}
@@ -3551,14 +3552,14 @@ class SqlBaseParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(527);
- ((PatternContext)_localctx).value = string();
setState(529);
+ ((PatternContext)_localctx).value = string();
+ setState(531);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) {
case 1:
{
- setState(528);
+ setState(530);
patternEscape();
}
break;
@@ -3606,25 +3607,25 @@ class SqlBaseParser extends Parser {
PatternEscapeContext _localctx = new PatternEscapeContext(_ctx, getState());
enterRule(_localctx, 56, RULE_patternEscape);
try {
- setState(537);
+ setState(539);
switch (_input.LA(1)) {
case ESCAPE:
enterOuterAlt(_localctx, 1);
{
- setState(531);
+ setState(533);
match(ESCAPE);
- setState(532);
+ setState(534);
((PatternEscapeContext)_localctx).escape = string();
}
break;
case ESCAPE_ESC:
enterOuterAlt(_localctx, 2);
{
- setState(533);
- match(ESCAPE_ESC);
- setState(534);
- ((PatternEscapeContext)_localctx).escape = string();
setState(535);
+ match(ESCAPE_ESC);
+ setState(536);
+ ((PatternEscapeContext)_localctx).escape = string();
+ setState(537);
match(ESC_END);
}
break;
@@ -3769,7 +3770,7 @@ class SqlBaseParser extends Parser {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(543);
+ setState(545);
switch (_input.LA(1)) {
case T__0:
case ANALYZE:
@@ -3777,6 +3778,7 @@ class SqlBaseParser extends Parser {
case CAST:
case CATALOGS:
case COLUMNS:
+ case CONVERT:
case DEBUG:
case EXECUTABLE:
case EXPLAIN:
@@ -3823,7 +3825,7 @@ class SqlBaseParser extends Parser {
_ctx = _localctx;
_prevctx = _localctx;
- setState(540);
+ setState(542);
primaryExpression();
}
break;
@@ -3833,7 +3835,7 @@ class SqlBaseParser extends Parser {
_localctx = new ArithmeticUnaryContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(541);
+ setState(543);
((ArithmeticUnaryContext)_localctx).operator = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==PLUS || _la==MINUS) ) {
@@ -3841,7 +3843,7 @@ class SqlBaseParser extends Parser {
} else {
consume();
}
- setState(542);
+ setState(544);
valueExpression(4);
}
break;
@@ -3849,7 +3851,7 @@ class SqlBaseParser extends Parser {
throw new NoViableAltException(this);
}
_ctx.stop = _input.LT(-1);
- setState(557);
+ setState(559);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,75,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
@@ -3857,7 +3859,7 @@ class SqlBaseParser extends Parser {
if ( _parseListeners!=null ) triggerExitRuleEvent();
_prevctx = _localctx;
{
- setState(555);
+ setState(557);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) {
case 1:
@@ -3865,17 +3867,17 @@ class SqlBaseParser extends Parser {
_localctx = new ArithmeticBinaryContext(new ValueExpressionContext(_parentctx, _parentState));
((ArithmeticBinaryContext)_localctx).left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_valueExpression);
- setState(545);
+ setState(547);
if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)");
- setState(546);
+ setState(548);
((ArithmeticBinaryContext)_localctx).operator = _input.LT(1);
_la = _input.LA(1);
- if ( !(((((_la - 91)) & ~0x3f) == 0 && ((1L << (_la - 91)) & ((1L << (ASTERISK - 91)) | (1L << (SLASH - 91)) | (1L << (PERCENT - 91)))) != 0)) ) {
+ if ( !(((((_la - 92)) & ~0x3f) == 0 && ((1L << (_la - 92)) & ((1L << (ASTERISK - 92)) | (1L << (SLASH - 92)) | (1L << (PERCENT - 92)))) != 0)) ) {
((ArithmeticBinaryContext)_localctx).operator = (Token)_errHandler.recoverInline(this);
} else {
consume();
}
- setState(547);
+ setState(549);
((ArithmeticBinaryContext)_localctx).right = valueExpression(4);
}
break;
@@ -3884,9 +3886,9 @@ class SqlBaseParser extends Parser {
_localctx = new ArithmeticBinaryContext(new ValueExpressionContext(_parentctx, _parentState));
((ArithmeticBinaryContext)_localctx).left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_valueExpression);
- setState(548);
+ setState(550);
if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)");
- setState(549);
+ setState(551);
((ArithmeticBinaryContext)_localctx).operator = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==PLUS || _la==MINUS) ) {
@@ -3894,7 +3896,7 @@ class SqlBaseParser extends Parser {
} else {
consume();
}
- setState(550);
+ setState(552);
((ArithmeticBinaryContext)_localctx).right = valueExpression(3);
}
break;
@@ -3903,18 +3905,18 @@ class SqlBaseParser extends Parser {
_localctx = new ComparisonContext(new ValueExpressionContext(_parentctx, _parentState));
((ComparisonContext)_localctx).left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_valueExpression);
- setState(551);
- if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
- setState(552);
- comparisonOperator();
setState(553);
+ if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
+ setState(554);
+ comparisonOperator();
+ setState(555);
((ComparisonContext)_localctx).right = valueExpression(2);
}
break;
}
}
}
- setState(559);
+ setState(561);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,75,_ctx);
}
@@ -4102,14 +4104,14 @@ class SqlBaseParser extends Parser {
enterRule(_localctx, 60, RULE_primaryExpression);
int _la;
try {
- setState(579);
+ setState(581);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) {
case 1:
_localctx = new CastContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(560);
+ setState(562);
castExpression();
}
break;
@@ -4117,7 +4119,7 @@ class SqlBaseParser extends Parser {
_localctx = new ExtractContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(561);
+ setState(563);
extractExpression();
}
break;
@@ -4125,7 +4127,7 @@ class SqlBaseParser extends Parser {
_localctx = new ConstantDefaultContext(_localctx);
enterOuterAlt(_localctx, 3);
{
- setState(562);
+ setState(564);
constant();
}
break;
@@ -4133,18 +4135,18 @@ class SqlBaseParser extends Parser {
_localctx = new StarContext(_localctx);
enterOuterAlt(_localctx, 4);
{
- setState(566);
+ setState(568);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (SYS - 64)) | (1L << (TABLES - 64)) | (1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (SHOW - 64)) | (1L << (SYS - 64)) | (1L << (TABLES - 64)) | (1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
{
- setState(563);
+ setState(565);
qualifiedName();
- setState(564);
+ setState(566);
match(DOT);
}
}
- setState(568);
+ setState(570);
match(ASTERISK);
}
break;
@@ -4152,7 +4154,7 @@ class SqlBaseParser extends Parser {
_localctx = new FunctionContext(_localctx);
enterOuterAlt(_localctx, 5);
{
- setState(569);
+ setState(571);
functionExpression();
}
break;
@@ -4160,11 +4162,11 @@ class SqlBaseParser extends Parser {
_localctx = new SubqueryExpressionContext(_localctx);
enterOuterAlt(_localctx, 6);
{
- setState(570);
- match(T__0);
- setState(571);
- query();
setState(572);
+ match(T__0);
+ setState(573);
+ query();
+ setState(574);
match(T__1);
}
break;
@@ -4172,7 +4174,7 @@ class SqlBaseParser extends Parser {
_localctx = new DereferenceContext(_localctx);
enterOuterAlt(_localctx, 7);
{
- setState(574);
+ setState(576);
qualifiedName();
}
break;
@@ -4180,11 +4182,11 @@ class SqlBaseParser extends Parser {
_localctx = new ParenthesizedExpressionContext(_localctx);
enterOuterAlt(_localctx, 8);
{
- setState(575);
- match(T__0);
- setState(576);
- expression();
setState(577);
+ match(T__0);
+ setState(578);
+ expression();
+ setState(579);
match(T__1);
}
break;
@@ -4207,6 +4209,9 @@ class SqlBaseParser extends Parser {
}
public TerminalNode FUNCTION_ESC() { return getToken(SqlBaseParser.FUNCTION_ESC, 0); }
public TerminalNode ESC_END() { return getToken(SqlBaseParser.ESC_END, 0); }
+ public ConvertTemplateContext convertTemplate() {
+ return getRuleContext(ConvertTemplateContext.class,0);
+ }
public CastExpressionContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@@ -4230,28 +4235,45 @@ class SqlBaseParser extends Parser {
CastExpressionContext _localctx = new CastExpressionContext(_ctx, getState());
enterRule(_localctx, 62, RULE_castExpression);
try {
- setState(586);
- switch (_input.LA(1)) {
- case CAST:
+ setState(593);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) {
+ case 1:
enterOuterAlt(_localctx, 1);
{
- setState(581);
+ setState(583);
castTemplate();
}
break;
- case FUNCTION_ESC:
+ case 2:
enterOuterAlt(_localctx, 2);
{
- setState(582);
- match(FUNCTION_ESC);
- setState(583);
- castTemplate();
setState(584);
+ match(FUNCTION_ESC);
+ setState(585);
+ castTemplate();
+ setState(586);
+ match(ESC_END);
+ }
+ break;
+ case 3:
+ enterOuterAlt(_localctx, 3);
+ {
+ setState(588);
+ convertTemplate();
+ }
+ break;
+ case 4:
+ enterOuterAlt(_localctx, 4);
+ {
+ setState(589);
+ match(FUNCTION_ESC);
+ setState(590);
+ convertTemplate();
+ setState(591);
match(ESC_END);
}
break;
- default:
- throw new NoViableAltException(this);
}
}
catch (RecognitionException re) {
@@ -4299,17 +4321,75 @@ class SqlBaseParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(588);
+ setState(595);
match(CAST);
- setState(589);
+ setState(596);
match(T__0);
- setState(590);
+ setState(597);
expression();
- setState(591);
+ setState(598);
match(AS);
- setState(592);
+ setState(599);
dataType();
- setState(593);
+ setState(600);
+ match(T__1);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class ConvertTemplateContext extends ParserRuleContext {
+ public TerminalNode CONVERT() { return getToken(SqlBaseParser.CONVERT, 0); }
+ public ExpressionContext expression() {
+ return getRuleContext(ExpressionContext.class,0);
+ }
+ public DataTypeContext dataType() {
+ return getRuleContext(DataTypeContext.class,0);
+ }
+ public ConvertTemplateContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_convertTemplate; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof SqlBaseListener ) ((SqlBaseListener)listener).enterConvertTemplate(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof SqlBaseListener ) ((SqlBaseListener)listener).exitConvertTemplate(this);
+ }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof SqlBaseVisitor ) return ((SqlBaseVisitor extends T>)visitor).visitConvertTemplate(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final ConvertTemplateContext convertTemplate() throws RecognitionException {
+ ConvertTemplateContext _localctx = new ConvertTemplateContext(_ctx, getState());
+ enterRule(_localctx, 66, RULE_convertTemplate);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(602);
+ match(CONVERT);
+ setState(603);
+ match(T__0);
+ setState(604);
+ expression();
+ setState(605);
+ match(T__2);
+ setState(606);
+ dataType();
+ setState(607);
match(T__1);
}
}
@@ -4351,25 +4431,25 @@ class SqlBaseParser extends Parser {
public final ExtractExpressionContext extractExpression() throws RecognitionException {
ExtractExpressionContext _localctx = new ExtractExpressionContext(_ctx, getState());
- enterRule(_localctx, 66, RULE_extractExpression);
+ enterRule(_localctx, 68, RULE_extractExpression);
try {
- setState(600);
+ setState(614);
switch (_input.LA(1)) {
case EXTRACT:
enterOuterAlt(_localctx, 1);
{
- setState(595);
+ setState(609);
extractTemplate();
}
break;
case FUNCTION_ESC:
enterOuterAlt(_localctx, 2);
{
- setState(596);
+ setState(610);
match(FUNCTION_ESC);
- setState(597);
+ setState(611);
extractTemplate();
- setState(598);
+ setState(612);
match(ESC_END);
}
break;
@@ -4419,21 +4499,21 @@ class SqlBaseParser extends Parser {
public final ExtractTemplateContext extractTemplate() throws RecognitionException {
ExtractTemplateContext _localctx = new ExtractTemplateContext(_ctx, getState());
- enterRule(_localctx, 68, RULE_extractTemplate);
+ enterRule(_localctx, 70, RULE_extractTemplate);
try {
enterOuterAlt(_localctx, 1);
{
- setState(602);
+ setState(616);
match(EXTRACT);
- setState(603);
+ setState(617);
match(T__0);
- setState(604);
+ setState(618);
((ExtractTemplateContext)_localctx).field = identifier();
- setState(605);
+ setState(619);
match(FROM);
- setState(606);
+ setState(620);
valueExpression(0);
- setState(607);
+ setState(621);
match(T__1);
}
}
@@ -4474,9 +4554,9 @@ class SqlBaseParser extends Parser {
public final FunctionExpressionContext functionExpression() throws RecognitionException {
FunctionExpressionContext _localctx = new FunctionExpressionContext(_ctx, getState());
- enterRule(_localctx, 70, RULE_functionExpression);
+ enterRule(_localctx, 72, RULE_functionExpression);
try {
- setState(614);
+ setState(628);
switch (_input.LA(1)) {
case ANALYZE:
case ANALYZED:
@@ -4511,18 +4591,18 @@ class SqlBaseParser extends Parser {
case BACKQUOTED_IDENTIFIER:
enterOuterAlt(_localctx, 1);
{
- setState(609);
+ setState(623);
functionTemplate();
}
break;
case FUNCTION_ESC:
enterOuterAlt(_localctx, 2);
{
- setState(610);
+ setState(624);
match(FUNCTION_ESC);
- setState(611);
+ setState(625);
functionTemplate();
- setState(612);
+ setState(626);
match(ESC_END);
}
break;
@@ -4575,50 +4655,50 @@ class SqlBaseParser extends Parser {
public final FunctionTemplateContext functionTemplate() throws RecognitionException {
FunctionTemplateContext _localctx = new FunctionTemplateContext(_ctx, getState());
- enterRule(_localctx, 72, RULE_functionTemplate);
+ enterRule(_localctx, 74, RULE_functionTemplate);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(616);
+ setState(630);
functionName();
- setState(617);
+ setState(631);
match(T__0);
- setState(629);
+ setState(643);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ALL) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CAST) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << DISTINCT) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << LEFT) | (1L << MAPPED) | (1L << MATCH) | (1L << NOT) | (1L << NULL) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RIGHT) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (SYS - 64)) | (1L << (TABLES - 64)) | (1L << (TEXT - 64)) | (1L << (TRUE - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (FUNCTION_ESC - 64)) | (1L << (DATE_ESC - 64)) | (1L << (TIME_ESC - 64)) | (1L << (TIMESTAMP_ESC - 64)) | (1L << (GUID_ESC - 64)) | (1L << (PLUS - 64)) | (1L << (MINUS - 64)) | (1L << (ASTERISK - 64)) | (1L << (PARAM - 64)) | (1L << (STRING - 64)) | (1L << (INTEGER_VALUE - 64)) | (1L << (DECIMAL_VALUE - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ALL) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CAST) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << CONVERT) | (1L << DEBUG) | (1L << DISTINCT) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << LEFT) | (1L << MAPPED) | (1L << MATCH) | (1L << NOT) | (1L << NULL) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RIGHT) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (SHOW - 64)) | (1L << (SYS - 64)) | (1L << (TABLES - 64)) | (1L << (TEXT - 64)) | (1L << (TRUE - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (FUNCTION_ESC - 64)) | (1L << (DATE_ESC - 64)) | (1L << (TIME_ESC - 64)) | (1L << (TIMESTAMP_ESC - 64)) | (1L << (GUID_ESC - 64)) | (1L << (PLUS - 64)) | (1L << (MINUS - 64)) | (1L << (ASTERISK - 64)) | (1L << (PARAM - 64)) | (1L << (STRING - 64)) | (1L << (INTEGER_VALUE - 64)) | (1L << (DECIMAL_VALUE - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
{
- setState(619);
+ setState(633);
_la = _input.LA(1);
if (_la==ALL || _la==DISTINCT) {
{
- setState(618);
+ setState(632);
setQuantifier();
}
}
- setState(621);
+ setState(635);
expression();
- setState(626);
+ setState(640);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__2) {
{
{
- setState(622);
+ setState(636);
match(T__2);
- setState(623);
+ setState(637);
expression();
}
}
- setState(628);
+ setState(642);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
}
- setState(631);
+ setState(645);
match(T__1);
}
}
@@ -4660,21 +4740,21 @@ class SqlBaseParser extends Parser {
public final FunctionNameContext functionName() throws RecognitionException {
FunctionNameContext _localctx = new FunctionNameContext(_ctx, getState());
- enterRule(_localctx, 74, RULE_functionName);
+ enterRule(_localctx, 76, RULE_functionName);
try {
- setState(636);
+ setState(650);
switch (_input.LA(1)) {
case LEFT:
enterOuterAlt(_localctx, 1);
{
- setState(633);
+ setState(647);
match(LEFT);
}
break;
case RIGHT:
enterOuterAlt(_localctx, 2);
{
- setState(634);
+ setState(648);
match(RIGHT);
}
break;
@@ -4709,7 +4789,7 @@ class SqlBaseParser extends Parser {
case BACKQUOTED_IDENTIFIER:
enterOuterAlt(_localctx, 3);
{
- setState(635);
+ setState(649);
identifier();
}
break;
@@ -4918,16 +4998,16 @@ class SqlBaseParser extends Parser {
public final ConstantContext constant() throws RecognitionException {
ConstantContext _localctx = new ConstantContext(_ctx, getState());
- enterRule(_localctx, 76, RULE_constant);
+ enterRule(_localctx, 78, RULE_constant);
try {
int _alt;
- setState(663);
+ setState(677);
switch (_input.LA(1)) {
case NULL:
_localctx = new NullLiteralContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(638);
+ setState(652);
match(NULL);
}
break;
@@ -4936,7 +5016,7 @@ class SqlBaseParser extends Parser {
_localctx = new NumericLiteralContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(639);
+ setState(653);
number();
}
break;
@@ -4945,7 +5025,7 @@ class SqlBaseParser extends Parser {
_localctx = new BooleanLiteralContext(_localctx);
enterOuterAlt(_localctx, 3);
{
- setState(640);
+ setState(654);
booleanValue();
}
break;
@@ -4953,7 +5033,7 @@ class SqlBaseParser extends Parser {
_localctx = new StringLiteralContext(_localctx);
enterOuterAlt(_localctx, 4);
{
- setState(642);
+ setState(656);
_errHandler.sync(this);
_alt = 1;
do {
@@ -4961,7 +5041,7 @@ class SqlBaseParser extends Parser {
case 1:
{
{
- setState(641);
+ setState(655);
match(STRING);
}
}
@@ -4969,7 +5049,7 @@ class SqlBaseParser extends Parser {
default:
throw new NoViableAltException(this);
}
- setState(644);
+ setState(658);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,85,_ctx);
} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
@@ -4979,7 +5059,7 @@ class SqlBaseParser extends Parser {
_localctx = new ParamLiteralContext(_localctx);
enterOuterAlt(_localctx, 5);
{
- setState(646);
+ setState(660);
match(PARAM);
}
break;
@@ -4987,11 +5067,11 @@ class SqlBaseParser extends Parser {
_localctx = new DateEscapedLiteralContext(_localctx);
enterOuterAlt(_localctx, 6);
{
- setState(647);
+ setState(661);
match(DATE_ESC);
- setState(648);
+ setState(662);
string();
- setState(649);
+ setState(663);
match(ESC_END);
}
break;
@@ -4999,11 +5079,11 @@ class SqlBaseParser extends Parser {
_localctx = new TimeEscapedLiteralContext(_localctx);
enterOuterAlt(_localctx, 7);
{
- setState(651);
+ setState(665);
match(TIME_ESC);
- setState(652);
+ setState(666);
string();
- setState(653);
+ setState(667);
match(ESC_END);
}
break;
@@ -5011,11 +5091,11 @@ class SqlBaseParser extends Parser {
_localctx = new TimestampEscapedLiteralContext(_localctx);
enterOuterAlt(_localctx, 8);
{
- setState(655);
+ setState(669);
match(TIMESTAMP_ESC);
- setState(656);
+ setState(670);
string();
- setState(657);
+ setState(671);
match(ESC_END);
}
break;
@@ -5023,11 +5103,11 @@ class SqlBaseParser extends Parser {
_localctx = new GuidEscapedLiteralContext(_localctx);
enterOuterAlt(_localctx, 9);
{
- setState(659);
+ setState(673);
match(GUID_ESC);
- setState(660);
+ setState(674);
string();
- setState(661);
+ setState(675);
match(ESC_END);
}
break;
@@ -5074,14 +5154,14 @@ class SqlBaseParser extends Parser {
public final ComparisonOperatorContext comparisonOperator() throws RecognitionException {
ComparisonOperatorContext _localctx = new ComparisonOperatorContext(_ctx, getState());
- enterRule(_localctx, 78, RULE_comparisonOperator);
+ enterRule(_localctx, 80, RULE_comparisonOperator);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(665);
+ setState(679);
_la = _input.LA(1);
- if ( !(((((_la - 83)) & ~0x3f) == 0 && ((1L << (_la - 83)) & ((1L << (EQ - 83)) | (1L << (NEQ - 83)) | (1L << (LT - 83)) | (1L << (LTE - 83)) | (1L << (GT - 83)) | (1L << (GTE - 83)))) != 0)) ) {
+ if ( !(((((_la - 84)) & ~0x3f) == 0 && ((1L << (_la - 84)) & ((1L << (EQ - 84)) | (1L << (NEQ - 84)) | (1L << (LT - 84)) | (1L << (LTE - 84)) | (1L << (GT - 84)) | (1L << (GTE - 84)))) != 0)) ) {
_errHandler.recoverInline(this);
} else {
consume();
@@ -5123,12 +5203,12 @@ class SqlBaseParser extends Parser {
public final BooleanValueContext booleanValue() throws RecognitionException {
BooleanValueContext _localctx = new BooleanValueContext(_ctx, getState());
- enterRule(_localctx, 80, RULE_booleanValue);
+ enterRule(_localctx, 82, RULE_booleanValue);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(667);
+ setState(681);
_la = _input.LA(1);
if ( !(_la==FALSE || _la==TRUE) ) {
_errHandler.recoverInline(this);
@@ -5181,12 +5261,12 @@ class SqlBaseParser extends Parser {
public final DataTypeContext dataType() throws RecognitionException {
DataTypeContext _localctx = new DataTypeContext(_ctx, getState());
- enterRule(_localctx, 82, RULE_dataType);
+ enterRule(_localctx, 84, RULE_dataType);
try {
_localctx = new PrimitiveDataTypeContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(669);
+ setState(683);
identifier();
}
}
@@ -5233,30 +5313,30 @@ class SqlBaseParser extends Parser {
public final QualifiedNameContext qualifiedName() throws RecognitionException {
QualifiedNameContext _localctx = new QualifiedNameContext(_ctx, getState());
- enterRule(_localctx, 84, RULE_qualifiedName);
+ enterRule(_localctx, 86, RULE_qualifiedName);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(676);
+ setState(690);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,87,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(671);
+ setState(685);
identifier();
- setState(672);
+ setState(686);
match(DOT);
}
}
}
- setState(678);
+ setState(692);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,87,_ctx);
}
- setState(679);
+ setState(693);
identifier();
}
}
@@ -5299,15 +5379,15 @@ class SqlBaseParser extends Parser {
public final IdentifierContext identifier() throws RecognitionException {
IdentifierContext _localctx = new IdentifierContext(_ctx, getState());
- enterRule(_localctx, 86, RULE_identifier);
+ enterRule(_localctx, 88, RULE_identifier);
try {
- setState(683);
+ setState(697);
switch (_input.LA(1)) {
case QUOTED_IDENTIFIER:
case BACKQUOTED_IDENTIFIER:
enterOuterAlt(_localctx, 1);
{
- setState(681);
+ setState(695);
quoteIdentifier();
}
break;
@@ -5340,7 +5420,7 @@ class SqlBaseParser extends Parser {
case DIGIT_IDENTIFIER:
enterOuterAlt(_localctx, 2);
{
- setState(682);
+ setState(696);
unquoteIdentifier();
}
break;
@@ -5390,46 +5470,46 @@ class SqlBaseParser extends Parser {
public final TableIdentifierContext tableIdentifier() throws RecognitionException {
TableIdentifierContext _localctx = new TableIdentifierContext(_ctx, getState());
- enterRule(_localctx, 88, RULE_tableIdentifier);
+ enterRule(_localctx, 90, RULE_tableIdentifier);
int _la;
try {
- setState(697);
+ setState(711);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,91,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(688);
+ setState(702);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (SYS - 64)) | (1L << (TABLES - 64)) | (1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (SHOW - 64)) | (1L << (SYS - 64)) | (1L << (TABLES - 64)) | (1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) {
{
- setState(685);
+ setState(699);
((TableIdentifierContext)_localctx).catalog = identifier();
- setState(686);
+ setState(700);
match(T__3);
}
}
- setState(690);
+ setState(704);
match(TABLE_IDENTIFIER);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(694);
+ setState(708);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) {
case 1:
{
- setState(691);
+ setState(705);
((TableIdentifierContext)_localctx).catalog = identifier();
- setState(692);
+ setState(706);
match(T__3);
}
break;
}
- setState(696);
+ setState(710);
((TableIdentifierContext)_localctx).name = identifier();
}
break;
@@ -5494,15 +5574,15 @@ class SqlBaseParser extends Parser {
public final QuoteIdentifierContext quoteIdentifier() throws RecognitionException {
QuoteIdentifierContext _localctx = new QuoteIdentifierContext(_ctx, getState());
- enterRule(_localctx, 90, RULE_quoteIdentifier);
+ enterRule(_localctx, 92, RULE_quoteIdentifier);
try {
- setState(701);
+ setState(715);
switch (_input.LA(1)) {
case QUOTED_IDENTIFIER:
_localctx = new QuotedIdentifierContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(699);
+ setState(713);
match(QUOTED_IDENTIFIER);
}
break;
@@ -5510,7 +5590,7 @@ class SqlBaseParser extends Parser {
_localctx = new BackQuotedIdentifierContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(700);
+ setState(714);
match(BACKQUOTED_IDENTIFIER);
}
break;
@@ -5580,15 +5660,15 @@ class SqlBaseParser extends Parser {
public final UnquoteIdentifierContext unquoteIdentifier() throws RecognitionException {
UnquoteIdentifierContext _localctx = new UnquoteIdentifierContext(_ctx, getState());
- enterRule(_localctx, 92, RULE_unquoteIdentifier);
+ enterRule(_localctx, 94, RULE_unquoteIdentifier);
try {
- setState(706);
+ setState(720);
switch (_input.LA(1)) {
case IDENTIFIER:
_localctx = new UnquotedIdentifierContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(703);
+ setState(717);
match(IDENTIFIER);
}
break;
@@ -5620,7 +5700,7 @@ class SqlBaseParser extends Parser {
_localctx = new UnquotedIdentifierContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(704);
+ setState(718);
nonReserved();
}
break;
@@ -5628,7 +5708,7 @@ class SqlBaseParser extends Parser {
_localctx = new DigitIdentifierContext(_localctx);
enterOuterAlt(_localctx, 3);
{
- setState(705);
+ setState(719);
match(DIGIT_IDENTIFIER);
}
break;
@@ -5695,15 +5775,15 @@ class SqlBaseParser extends Parser {
public final NumberContext number() throws RecognitionException {
NumberContext _localctx = new NumberContext(_ctx, getState());
- enterRule(_localctx, 94, RULE_number);
+ enterRule(_localctx, 96, RULE_number);
try {
- setState(710);
+ setState(724);
switch (_input.LA(1)) {
case DECIMAL_VALUE:
_localctx = new DecimalLiteralContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(708);
+ setState(722);
match(DECIMAL_VALUE);
}
break;
@@ -5711,7 +5791,7 @@ class SqlBaseParser extends Parser {
_localctx = new IntegerLiteralContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(709);
+ setState(723);
match(INTEGER_VALUE);
}
break;
@@ -5754,12 +5834,12 @@ class SqlBaseParser extends Parser {
public final StringContext string() throws RecognitionException {
StringContext _localctx = new StringContext(_ctx, getState());
- enterRule(_localctx, 96, RULE_string);
+ enterRule(_localctx, 98, RULE_string);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(712);
+ setState(726);
_la = _input.LA(1);
if ( !(_la==PARAM || _la==STRING) ) {
_errHandler.recoverInline(this);
@@ -5826,14 +5906,14 @@ class SqlBaseParser extends Parser {
public final NonReservedContext nonReserved() throws RecognitionException {
NonReservedContext _localctx = new NonReservedContext(_ctx, getState());
- enterRule(_localctx, 98, RULE_nonReserved);
+ enterRule(_localctx, 100, RULE_nonReserved);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(714);
+ setState(728);
_la = _input.LA(1);
- if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (SYS - 64)) | (1L << (TABLES - 64)) | (1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)))) != 0)) ) {
+ if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (SHOW - 64)) | (1L << (SYS - 64)) | (1L << (TABLES - 64)) | (1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)))) != 0)) ) {
_errHandler.recoverInline(this);
} else {
consume();
@@ -5882,288 +5962,293 @@ class SqlBaseParser extends Parser {
}
public static final String _serializedATN =
- "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3o\u02cf\4\2\t\2\4"+
+ "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3p\u02dd\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\3\2\3\2"+
- "\3\2\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\7\4v\n\4\f\4\16\4"+
- "y\13\4\3\4\5\4|\n\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\7\4\u0085\n\4\f\4\16\4"+
- "\u0088\13\4\3\4\5\4\u008b\n\4\3\4\3\4\3\4\3\4\3\4\5\4\u0092\n\4\3\4\3"+
- "\4\3\4\3\4\3\4\5\4\u0099\n\4\3\4\3\4\3\4\5\4\u009e\n\4\3\4\3\4\3\4\5\4"+
- "\u00a3\n\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\5\4\u00ad\n\4\3\4\3\4\5\4\u00b1"+
- "\n\4\3\4\3\4\3\4\3\4\7\4\u00b7\n\4\f\4\16\4\u00ba\13\4\5\4\u00bc\n\4\3"+
- "\4\3\4\3\4\3\4\5\4\u00c2\n\4\3\4\3\4\3\4\5\4\u00c7\n\4\3\4\5\4\u00ca\n"+
- "\4\3\4\3\4\3\4\3\4\3\4\5\4\u00d1\n\4\3\5\3\5\3\5\3\5\7\5\u00d7\n\5\f\5"+
- "\16\5\u00da\13\5\5\5\u00dc\n\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\7\6\u00e6"+
- "\n\6\f\6\16\6\u00e9\13\6\5\6\u00eb\n\6\3\6\5\6\u00ee\n\6\3\7\3\7\3\7\3"+
- "\7\3\7\5\7\u00f5\n\7\3\b\3\b\3\b\3\b\3\b\5\b\u00fc\n\b\3\t\3\t\5\t\u0100"+
- "\n\t\3\t\3\t\5\t\u0104\n\t\3\n\3\n\5\n\u0108\n\n\3\n\3\n\3\n\7\n\u010d"+
- "\n\n\f\n\16\n\u0110\13\n\3\n\5\n\u0113\n\n\3\n\3\n\5\n\u0117\n\n\3\n\3"+
- "\n\3\n\5\n\u011c\n\n\3\n\3\n\5\n\u0120\n\n\3\13\3\13\3\13\3\13\7\13\u0126"+
- "\n\13\f\13\16\13\u0129\13\13\3\f\5\f\u012c\n\f\3\f\3\f\3\f\7\f\u0131\n"+
- "\f\f\f\16\f\u0134\13\f\3\r\3\r\3\16\3\16\3\16\3\16\7\16\u013c\n\16\f\16"+
- "\16\16\u013f\13\16\5\16\u0141\n\16\3\16\3\16\5\16\u0145\n\16\3\17\3\17"+
- "\3\17\3\17\3\17\3\17\3\20\3\20\3\21\3\21\5\21\u0151\n\21\3\21\5\21\u0154"+
- "\n\21\3\22\3\22\7\22\u0158\n\22\f\22\16\22\u015b\13\22\3\23\3\23\3\23"+
- "\3\23\5\23\u0161\n\23\3\23\3\23\3\23\3\23\3\23\5\23\u0168\n\23\3\24\5"+
- "\24\u016b\n\24\3\24\3\24\5\24\u016f\n\24\3\24\3\24\5\24\u0173\n\24\3\24"+
- "\3\24\5\24\u0177\n\24\5\24\u0179\n\24\3\25\3\25\3\25\3\25\3\25\3\25\3"+
- "\25\7\25\u0182\n\25\f\25\16\25\u0185\13\25\3\25\3\25\5\25\u0189\n\25\3"+
- "\26\3\26\5\26\u018d\n\26\3\26\5\26\u0190\n\26\3\26\3\26\3\26\3\26\5\26"+
- "\u0196\n\26\3\26\5\26\u0199\n\26\3\26\3\26\3\26\3\26\5\26\u019f\n\26\3"+
- "\26\5\26\u01a2\n\26\5\26\u01a4\n\26\3\27\3\27\3\30\3\30\3\30\3\30\3\30"+
+ ",\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\3\2\3\2\3\2\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\7\4x\n"+
+ "\4\f\4\16\4{\13\4\3\4\5\4~\n\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\7\4\u0087\n"+
+ "\4\f\4\16\4\u008a\13\4\3\4\5\4\u008d\n\4\3\4\3\4\3\4\3\4\3\4\5\4\u0094"+
+ "\n\4\3\4\3\4\3\4\3\4\3\4\5\4\u009b\n\4\3\4\3\4\3\4\5\4\u00a0\n\4\3\4\3"+
+ "\4\3\4\5\4\u00a5\n\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\5\4\u00af\n\4\3\4"+
+ "\3\4\5\4\u00b3\n\4\3\4\3\4\3\4\3\4\7\4\u00b9\n\4\f\4\16\4\u00bc\13\4\5"+
+ "\4\u00be\n\4\3\4\3\4\3\4\3\4\5\4\u00c4\n\4\3\4\3\4\3\4\5\4\u00c9\n\4\3"+
+ "\4\5\4\u00cc\n\4\3\4\3\4\3\4\3\4\3\4\5\4\u00d3\n\4\3\5\3\5\3\5\3\5\7\5"+
+ "\u00d9\n\5\f\5\16\5\u00dc\13\5\5\5\u00de\n\5\3\5\3\5\3\6\3\6\3\6\3\6\3"+
+ "\6\3\6\7\6\u00e8\n\6\f\6\16\6\u00eb\13\6\5\6\u00ed\n\6\3\6\5\6\u00f0\n"+
+ "\6\3\7\3\7\3\7\3\7\3\7\5\7\u00f7\n\7\3\b\3\b\3\b\3\b\3\b\5\b\u00fe\n\b"+
+ "\3\t\3\t\5\t\u0102\n\t\3\t\3\t\5\t\u0106\n\t\3\n\3\n\5\n\u010a\n\n\3\n"+
+ "\3\n\3\n\7\n\u010f\n\n\f\n\16\n\u0112\13\n\3\n\5\n\u0115\n\n\3\n\3\n\5"+
+ "\n\u0119\n\n\3\n\3\n\3\n\5\n\u011e\n\n\3\n\3\n\5\n\u0122\n\n\3\13\3\13"+
+ "\3\13\3\13\7\13\u0128\n\13\f\13\16\13\u012b\13\13\3\f\5\f\u012e\n\f\3"+
+ "\f\3\f\3\f\7\f\u0133\n\f\f\f\16\f\u0136\13\f\3\r\3\r\3\16\3\16\3\16\3"+
+ "\16\7\16\u013e\n\16\f\16\16\16\u0141\13\16\5\16\u0143\n\16\3\16\3\16\5"+
+ "\16\u0147\n\16\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\21\3\21\5\21"+
+ "\u0153\n\21\3\21\5\21\u0156\n\21\3\22\3\22\7\22\u015a\n\22\f\22\16\22"+
+ "\u015d\13\22\3\23\3\23\3\23\3\23\5\23\u0163\n\23\3\23\3\23\3\23\3\23\3"+
+ "\23\5\23\u016a\n\23\3\24\5\24\u016d\n\24\3\24\3\24\5\24\u0171\n\24\3\24"+
+ "\3\24\5\24\u0175\n\24\3\24\3\24\5\24\u0179\n\24\5\24\u017b\n\24\3\25\3"+
+ "\25\3\25\3\25\3\25\3\25\3\25\7\25\u0184\n\25\f\25\16\25\u0187\13\25\3"+
+ "\25\3\25\5\25\u018b\n\25\3\26\3\26\5\26\u018f\n\26\3\26\5\26\u0192\n\26"+
+ "\3\26\3\26\3\26\3\26\5\26\u0198\n\26\3\26\5\26\u019b\n\26\3\26\3\26\3"+
+ "\26\3\26\5\26\u01a1\n\26\3\26\5\26\u01a4\n\26\5\26\u01a6\n\26\3\27\3\27"+
"\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\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\5\30\u01c7"+
- "\n\30\3\30\3\30\3\30\3\30\3\30\3\30\7\30\u01cf\n\30\f\30\16\30\u01d2\13"+
- "\30\3\31\3\31\7\31\u01d6\n\31\f\31\16\31\u01d9\13\31\3\32\3\32\5\32\u01dd"+
- "\n\32\3\33\5\33\u01e0\n\33\3\33\3\33\3\33\3\33\3\33\3\33\5\33\u01e8\n"+
- "\33\3\33\3\33\3\33\3\33\3\33\7\33\u01ef\n\33\f\33\16\33\u01f2\13\33\3"+
- "\33\3\33\3\33\5\33\u01f7\n\33\3\33\3\33\3\33\3\33\3\33\3\33\5\33\u01ff"+
- "\n\33\3\33\3\33\3\33\5\33\u0204\n\33\3\33\3\33\3\33\3\33\5\33\u020a\n"+
- "\33\3\33\5\33\u020d\n\33\3\34\3\34\3\34\3\35\3\35\5\35\u0214\n\35\3\36"+
- "\3\36\3\36\3\36\3\36\3\36\5\36\u021c\n\36\3\37\3\37\3\37\3\37\5\37\u0222"+
- "\n\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\7\37\u022e\n\37"+
- "\f\37\16\37\u0231\13\37\3 \3 \3 \3 \3 \3 \5 \u0239\n \3 \3 \3 \3 \3 \3"+
- " \3 \3 \3 \3 \3 \5 \u0246\n \3!\3!\3!\3!\3!\5!\u024d\n!\3\"\3\"\3\"\3"+
- "\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\5#\u025b\n#\3$\3$\3$\3$\3$\3$\3$\3%\3%\3"+
- "%\3%\3%\5%\u0269\n%\3&\3&\3&\5&\u026e\n&\3&\3&\3&\7&\u0273\n&\f&\16&\u0276"+
- "\13&\5&\u0278\n&\3&\3&\3\'\3\'\3\'\5\'\u027f\n\'\3(\3(\3(\3(\6(\u0285"+
- "\n(\r(\16(\u0286\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\5"+
- "(\u029a\n(\3)\3)\3*\3*\3+\3+\3,\3,\3,\7,\u02a5\n,\f,\16,\u02a8\13,\3,"+
- "\3,\3-\3-\5-\u02ae\n-\3.\3.\3.\5.\u02b3\n.\3.\3.\3.\3.\5.\u02b9\n.\3."+
- "\5.\u02bc\n.\3/\3/\5/\u02c0\n/\3\60\3\60\3\60\5\60\u02c5\n\60\3\61\3\61"+
- "\5\61\u02c9\n\61\3\62\3\62\3\63\3\63\3\63\2\4.<\64\2\4\6\b\n\f\16\20\22"+
- "\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bd\2\21\b"+
- "\2\7\7\t\t\31\31..\65\6599\4\2##EE\4\2\t\t\65\65\4\2 &&\3\2\25\26\4\2"+
- "\7\7dd\4\2\r\r\25\25\4\2\36\36**\4\2\7\7\27\27\3\2[\\\3\2]_\3\2UZ\4\2"+
- "\35\35FF\3\2bc\20\2\b\t\22\24\31\31\33\33\37\37\"#..\65\659;=?ABDEGHJ"+
- "J\u0325\2f\3\2\2\2\4i\3\2\2\2\6\u00d0\3\2\2\2\b\u00db\3\2\2\2\n\u00df"+
- "\3\2\2\2\f\u00f4\3\2\2\2\16\u00fb\3\2\2\2\20\u00fd\3\2\2\2\22\u0105\3"+
- "\2\2\2\24\u0121\3\2\2\2\26\u012b\3\2\2\2\30\u0135\3\2\2\2\32\u0144\3\2"+
- "\2\2\34\u0146\3\2\2\2\36\u014c\3\2\2\2 \u014e\3\2\2\2\"\u0155\3\2\2\2"+
- "$\u0167\3\2\2\2&\u0178\3\2\2\2(\u0188\3\2\2\2*\u01a3\3\2\2\2,\u01a5\3"+
- "\2\2\2.\u01c6\3\2\2\2\60\u01d7\3\2\2\2\62\u01da\3\2\2\2\64\u020c\3\2\2"+
- "\2\66\u020e\3\2\2\28\u0211\3\2\2\2:\u021b\3\2\2\2<\u0221\3\2\2\2>\u0245"+
- "\3\2\2\2@\u024c\3\2\2\2B\u024e\3\2\2\2D\u025a\3\2\2\2F\u025c\3\2\2\2H"+
- "\u0268\3\2\2\2J\u026a\3\2\2\2L\u027e\3\2\2\2N\u0299\3\2\2\2P\u029b\3\2"+
- "\2\2R\u029d\3\2\2\2T\u029f\3\2\2\2V\u02a6\3\2\2\2X\u02ad\3\2\2\2Z\u02bb"+
- "\3\2\2\2\\\u02bf\3\2\2\2^\u02c4\3\2\2\2`\u02c8\3\2\2\2b\u02ca\3\2\2\2"+
- "d\u02cc\3\2\2\2fg\5\6\4\2gh\7\2\2\3h\3\3\2\2\2ij\5,\27\2jk\7\2\2\3k\5"+
- "\3\2\2\2l\u00d1\5\b\5\2m{\7\33\2\2nw\7\3\2\2op\7;\2\2pv\t\2\2\2qr\7\37"+
- "\2\2rv\t\3\2\2st\7J\2\2tv\5R*\2uo\3\2\2\2uq\3\2\2\2us\3\2\2\2vy\3\2\2"+
- "\2wu\3\2\2\2wx\3\2\2\2xz\3\2\2\2yw\3\2\2\2z|\7\4\2\2{n\3\2\2\2{|\3\2\2"+
- "\2|}\3\2\2\2}\u00d1\5\6\4\2~\u008a\7\24\2\2\177\u0086\7\3\2\2\u0080\u0081"+
- "\7;\2\2\u0081\u0085\t\4\2\2\u0082\u0083\7\37\2\2\u0083\u0085\t\3\2\2\u0084"+
- "\u0080\3\2\2\2\u0084\u0082\3\2\2\2\u0085\u0088\3\2\2\2\u0086\u0084\3\2"+
- "\2\2\u0086\u0087\3\2\2\2\u0087\u0089\3\2\2\2\u0088\u0086\3\2\2\2\u0089"+
- "\u008b\7\4\2\2\u008a\177\3\2\2\2\u008a\u008b\3\2\2\2\u008b\u008c\3\2\2"+
- "\2\u008c\u00d1\5\6\4\2\u008d\u008e\7A\2\2\u008e\u0091\7D\2\2\u008f\u0092"+
- "\5\66\34\2\u0090\u0092\5Z.\2\u0091\u008f\3\2\2\2\u0091\u0090\3\2\2\2\u0091"+
- "\u0092\3\2\2\2\u0092\u00d1\3\2\2\2\u0093\u0094\7A\2\2\u0094\u0095\7\23"+
- "\2\2\u0095\u0098\t\5\2\2\u0096\u0099\5\66\34\2\u0097\u0099\5Z.\2\u0098"+
- "\u0096\3\2\2\2\u0098\u0097\3\2\2\2\u0099\u00d1\3\2\2\2\u009a\u009d\t\6"+
- "\2\2\u009b\u009e\5\66\34\2\u009c\u009e\5Z.\2\u009d\u009b\3\2\2\2\u009d"+
- "\u009c\3\2\2\2\u009e\u00d1\3\2\2\2\u009f\u00a0\7A\2\2\u00a0\u00a2\7\""+
- "\2\2\u00a1\u00a3\5\66\34\2\u00a2\u00a1\3\2\2\2\u00a2\u00a3\3\2\2\2\u00a3"+
- "\u00d1\3\2\2\2\u00a4\u00a5\7A\2\2\u00a5\u00d1\7?\2\2\u00a6\u00a7\7B\2"+
- "\2\u00a7\u00d1\7\22\2\2\u00a8\u00a9\7B\2\2\u00a9\u00ac\7D\2\2\u00aa\u00ab"+
- "\7\21\2\2\u00ab\u00ad\5\66\34\2\u00ac\u00aa\3\2\2\2\u00ac\u00ad\3\2\2"+
- "\2\u00ad\u00b0\3\2\2\2\u00ae\u00b1\5\66\34\2\u00af\u00b1\5Z.\2\u00b0\u00ae"+
- "\3\2\2\2\u00b0\u00af\3\2\2\2\u00b0\u00b1\3\2\2\2\u00b1\u00bb\3\2\2\2\u00b2"+
- "\u00b3\7G\2\2\u00b3\u00b8\5b\62\2\u00b4\u00b5\7\5\2\2\u00b5\u00b7\5b\62"+
- "\2\u00b6\u00b4\3\2\2\2\u00b7\u00ba\3\2\2\2\u00b8\u00b6\3\2\2\2\u00b8\u00b9"+
- "\3\2\2\2\u00b9\u00bc\3\2\2\2\u00ba\u00b8\3\2\2\2\u00bb\u00b2\3\2\2\2\u00bb"+
- "\u00bc\3\2\2\2\u00bc\u00d1\3\2\2\2\u00bd\u00be\7B\2\2\u00be\u00c1\7\23"+
- "\2\2\u00bf\u00c0\7\21\2\2\u00c0\u00c2\5b\62\2\u00c1\u00bf\3\2\2\2\u00c1"+
- "\u00c2\3\2\2\2\u00c2\u00c6\3\2\2\2\u00c3\u00c4\7C\2\2\u00c4\u00c7\5\66"+
- "\34\2\u00c5\u00c7\5Z.\2\u00c6\u00c3\3\2\2\2\u00c6\u00c5\3\2\2\2\u00c6"+
- "\u00c7\3\2\2\2\u00c7\u00c9\3\2\2\2\u00c8\u00ca\5\66\34\2\u00c9\u00c8\3"+
- "\2\2\2\u00c9\u00ca\3\2\2\2\u00ca\u00d1\3\2\2\2\u00cb\u00cc\7B\2\2\u00cc"+
- "\u00d1\7H\2\2\u00cd\u00ce\7B\2\2\u00ce\u00cf\7C\2\2\u00cf\u00d1\7H\2\2"+
- "\u00d0l\3\2\2\2\u00d0m\3\2\2\2\u00d0~\3\2\2\2\u00d0\u008d\3\2\2\2\u00d0"+
- "\u0093\3\2\2\2\u00d0\u009a\3\2\2\2\u00d0\u009f\3\2\2\2\u00d0\u00a4\3\2"+
- "\2\2\u00d0\u00a6\3\2\2\2\u00d0\u00a8\3\2\2\2\u00d0\u00bd\3\2\2\2\u00d0"+
- "\u00cb\3\2\2\2\u00d0\u00cd\3\2\2\2\u00d1\7\3\2\2\2\u00d2\u00d3\7L\2\2"+
- "\u00d3\u00d8\5\34\17\2\u00d4\u00d5\7\5\2\2\u00d5\u00d7\5\34\17\2\u00d6"+
- "\u00d4\3\2\2\2\u00d7\u00da\3\2\2\2\u00d8\u00d6\3\2\2\2\u00d8\u00d9\3\2"+
- "\2\2\u00d9\u00dc\3\2\2\2\u00da\u00d8\3\2\2\2\u00db\u00d2\3\2\2\2\u00db"+
- "\u00dc\3\2\2\2\u00dc\u00dd\3\2\2\2\u00dd\u00de\5\n\6\2\u00de\t\3\2\2\2"+
- "\u00df\u00ea\5\16\b\2\u00e0\u00e1\7\67\2\2\u00e1\u00e2\7\17\2\2\u00e2"+
- "\u00e7\5\20\t\2\u00e3\u00e4\7\5\2\2\u00e4\u00e6\5\20\t\2\u00e5\u00e3\3"+
- "\2\2\2\u00e6\u00e9\3\2\2\2\u00e7\u00e5\3\2\2\2\u00e7\u00e8\3\2\2\2\u00e8"+
- "\u00eb\3\2\2\2\u00e9\u00e7\3\2\2\2\u00ea\u00e0\3\2\2\2\u00ea\u00eb\3\2"+
- "\2\2\u00eb\u00ed\3\2\2\2\u00ec\u00ee\5\f\7\2\u00ed\u00ec\3\2\2\2\u00ed"+
- "\u00ee\3\2\2\2\u00ee\13\3\2\2\2\u00ef\u00f0\7-\2\2\u00f0\u00f5\t\7\2\2"+
- "\u00f1\u00f2\7O\2\2\u00f2\u00f3\t\7\2\2\u00f3\u00f5\7T\2\2\u00f4\u00ef"+
- "\3\2\2\2\u00f4\u00f1\3\2\2\2\u00f5\r\3\2\2\2\u00f6\u00fc\5\22\n\2\u00f7"+
- "\u00f8\7\3\2\2\u00f8\u00f9\5\n\6\2\u00f9\u00fa\7\4\2\2\u00fa\u00fc\3\2"+
- "\2\2\u00fb\u00f6\3\2\2\2\u00fb\u00f7\3\2\2\2\u00fc\17\3\2\2\2\u00fd\u00ff"+
- "\5,\27\2\u00fe\u0100\t\b\2\2\u00ff\u00fe\3\2\2\2\u00ff\u0100\3\2\2\2\u0100"+
- "\u0103\3\2\2\2\u0101\u0102\7\63\2\2\u0102\u0104\t\t\2\2\u0103\u0101\3"+
- "\2\2\2\u0103\u0104\3\2\2\2\u0104\21\3\2\2\2\u0105\u0107\7@\2\2\u0106\u0108"+
- "\5\36\20\2\u0107\u0106\3\2\2\2\u0107\u0108\3\2\2\2\u0108\u0109\3\2\2\2"+
- "\u0109\u010e\5 \21\2\u010a\u010b\7\5\2\2\u010b\u010d\5 \21\2\u010c\u010a"+
- "\3\2\2\2\u010d\u0110\3\2\2\2\u010e\u010c\3\2\2\2\u010e\u010f\3\2\2\2\u010f"+
- "\u0112\3\2\2\2\u0110\u010e\3\2\2\2\u0111\u0113\5\24\13\2\u0112\u0111\3"+
- "\2\2\2\u0112\u0113\3\2\2\2\u0113\u0116\3\2\2\2\u0114\u0115\7K\2\2\u0115"+
- "\u0117\5.\30\2\u0116\u0114\3\2\2\2\u0116\u0117\3\2\2\2\u0117\u011b\3\2"+
- "\2\2\u0118\u0119\7$\2\2\u0119\u011a\7\17\2\2\u011a\u011c\5\26\f\2\u011b"+
- "\u0118\3\2\2\2\u011b\u011c\3\2\2\2\u011c\u011f\3\2\2\2\u011d\u011e\7%"+
- "\2\2\u011e\u0120\5.\30\2\u011f\u011d\3\2\2\2\u011f\u0120\3\2\2\2\u0120"+
- "\23\3\2\2\2\u0121\u0122\7 \2\2\u0122\u0127\5\"\22\2\u0123\u0124\7\5\2"+
- "\2\u0124\u0126\5\"\22\2\u0125\u0123\3\2\2\2\u0126\u0129\3\2\2\2\u0127"+
- "\u0125\3\2\2\2\u0127\u0128\3\2\2\2\u0128\25\3\2\2\2\u0129\u0127\3\2\2"+
- "\2\u012a\u012c\5\36\20\2\u012b\u012a\3\2\2\2\u012b\u012c\3\2\2\2\u012c"+
- "\u012d\3\2\2\2\u012d\u0132\5\30\r\2\u012e\u012f\7\5\2\2\u012f\u0131\5"+
- "\30\r\2\u0130\u012e\3\2\2\2\u0131\u0134\3\2\2\2\u0132\u0130\3\2\2\2\u0132"+
- "\u0133\3\2\2\2\u0133\27\3\2\2\2\u0134\u0132\3\2\2\2\u0135\u0136\5\32\16"+
- "\2\u0136\31\3\2\2\2\u0137\u0140\7\3\2\2\u0138\u013d\5,\27\2\u0139\u013a"+
- "\7\5\2\2\u013a\u013c\5,\27\2\u013b\u0139\3\2\2\2\u013c\u013f\3\2\2\2\u013d"+
- "\u013b\3\2\2\2\u013d\u013e\3\2\2\2\u013e\u0141\3\2\2\2\u013f\u013d\3\2"+
- "\2\2\u0140\u0138\3\2\2\2\u0140\u0141\3\2\2\2\u0141\u0142\3\2\2\2\u0142"+
- "\u0145\7\4\2\2\u0143\u0145\5,\27\2\u0144\u0137\3\2\2\2\u0144\u0143\3\2"+
- "\2\2\u0145\33\3\2\2\2\u0146\u0147\5X-\2\u0147\u0148\7\f\2\2\u0148\u0149"+
- "\7\3\2\2\u0149\u014a\5\n\6\2\u014a\u014b\7\4\2\2\u014b\35\3\2\2\2\u014c"+
- "\u014d\t\n\2\2\u014d\37\3\2\2\2\u014e\u0153\5,\27\2\u014f\u0151\7\f\2"+
- "\2\u0150\u014f\3\2\2\2\u0150\u0151\3\2\2\2\u0151\u0152\3\2\2\2\u0152\u0154"+
- "\5X-\2\u0153\u0150\3\2\2\2\u0153\u0154\3\2\2\2\u0154!\3\2\2\2\u0155\u0159"+
- "\5*\26\2\u0156\u0158\5$\23\2\u0157\u0156\3\2\2\2\u0158\u015b\3\2\2\2\u0159"+
- "\u0157\3\2\2\2\u0159\u015a\3\2\2\2\u015a#\3\2\2\2\u015b\u0159\3\2\2\2"+
- "\u015c\u015d\5&\24\2\u015d\u015e\7)\2\2\u015e\u0160\5*\26\2\u015f\u0161"+
- "\5(\25\2\u0160\u015f\3\2\2\2\u0160\u0161\3\2\2\2\u0161\u0168\3\2\2\2\u0162"+
- "\u0163\7\60\2\2\u0163\u0164\5&\24\2\u0164\u0165\7)\2\2\u0165\u0166\5*"+
- "\26\2\u0166\u0168\3\2\2\2\u0167\u015c\3\2\2\2\u0167\u0162\3\2\2\2\u0168"+
- "%\3\2\2\2\u0169\u016b\7\'\2\2\u016a\u0169\3\2\2\2\u016a\u016b\3\2\2\2"+
- "\u016b\u0179\3\2\2\2\u016c\u016e\7+\2\2\u016d\u016f\78\2\2\u016e\u016d"+
- "\3\2\2\2\u016e\u016f\3\2\2\2\u016f\u0179\3\2\2\2\u0170\u0172\7<\2\2\u0171"+
- "\u0173\78\2\2\u0172\u0171\3\2\2\2\u0172\u0173\3\2\2\2\u0173\u0179\3\2"+
- "\2\2\u0174\u0176\7!\2\2\u0175\u0177\78\2\2\u0176\u0175\3\2\2\2\u0176\u0177"+
- "\3\2\2\2\u0177\u0179\3\2\2\2\u0178\u016a\3\2\2\2\u0178\u016c\3\2\2\2\u0178"+
- "\u0170\3\2\2\2\u0178\u0174\3\2\2\2\u0179\'\3\2\2\2\u017a\u017b\7\64\2"+
- "\2\u017b\u0189\5.\30\2\u017c\u017d\7I\2\2\u017d\u017e\7\3\2\2\u017e\u0183"+
- "\5X-\2\u017f\u0180\7\5\2\2\u0180\u0182\5X-\2\u0181\u017f\3\2\2\2\u0182"+
- "\u0185\3\2\2\2\u0183\u0181\3\2\2\2\u0183\u0184\3\2\2\2\u0184\u0186\3\2"+
- "\2\2\u0185\u0183\3\2\2\2\u0186\u0187\7\4\2\2\u0187\u0189\3\2\2\2\u0188"+
- "\u017a\3\2\2\2\u0188\u017c\3\2\2\2\u0189)\3\2\2\2\u018a\u018f\5Z.\2\u018b"+
- "\u018d\7\f\2\2\u018c\u018b\3\2\2\2\u018c\u018d\3\2\2\2\u018d\u018e\3\2"+
- "\2\2\u018e\u0190\5V,\2\u018f\u018c\3\2\2\2\u018f\u0190\3\2\2\2\u0190\u01a4"+
- "\3\2\2\2\u0191\u0192\7\3\2\2\u0192\u0193\5\n\6\2\u0193\u0198\7\4\2\2\u0194"+
- "\u0196\7\f\2\2\u0195\u0194\3\2\2\2\u0195\u0196\3\2\2\2\u0196\u0197\3\2"+
- "\2\2\u0197\u0199\5V,\2\u0198\u0195\3\2\2\2\u0198\u0199\3\2\2\2\u0199\u01a4"+
- "\3\2\2\2\u019a\u019b\7\3\2\2\u019b\u019c\5\"\22\2\u019c\u01a1\7\4\2\2"+
- "\u019d\u019f\7\f\2\2\u019e\u019d\3\2\2\2\u019e\u019f\3\2\2\2\u019f\u01a0"+
- "\3\2\2\2\u01a0\u01a2\5V,\2\u01a1\u019e\3\2\2\2\u01a1\u01a2\3\2\2\2\u01a2"+
- "\u01a4\3\2\2\2\u01a3\u018a\3\2\2\2\u01a3\u0191\3\2\2\2\u01a3\u019a\3\2"+
- "\2\2\u01a4+\3\2\2\2\u01a5\u01a6\5.\30\2\u01a6-\3\2\2\2\u01a7\u01a8\b\30"+
- "\1\2\u01a8\u01a9\7\61\2\2\u01a9\u01c7\5.\30\n\u01aa\u01ab\7\32\2\2\u01ab"+
- "\u01ac\7\3\2\2\u01ac\u01ad\5\b\5\2\u01ad\u01ae\7\4\2\2\u01ae\u01c7\3\2"+
- "\2\2\u01af\u01b0\7>\2\2\u01b0\u01b1\7\3\2\2\u01b1\u01b2\5b\62\2\u01b2"+
- "\u01b3\5\60\31\2\u01b3\u01b4\7\4\2\2\u01b4\u01c7\3\2\2\2\u01b5\u01b6\7"+
- "/\2\2\u01b6\u01b7\7\3\2\2\u01b7\u01b8\5V,\2\u01b8\u01b9\7\5\2\2\u01b9"+
- "\u01ba\5b\62\2\u01ba\u01bb\5\60\31\2\u01bb\u01bc\7\4\2\2\u01bc\u01c7\3"+
- "\2\2\2\u01bd\u01be\7/\2\2\u01be\u01bf\7\3\2\2\u01bf\u01c0\5b\62\2\u01c0"+
- "\u01c1\7\5\2\2\u01c1\u01c2\5b\62\2\u01c2\u01c3\5\60\31\2\u01c3\u01c4\7"+
- "\4\2\2\u01c4\u01c7\3\2\2\2\u01c5\u01c7\5\62\32\2\u01c6\u01a7\3\2\2\2\u01c6"+
- "\u01aa\3\2\2\2\u01c6\u01af\3\2\2\2\u01c6\u01b5\3\2\2\2\u01c6\u01bd\3\2"+
- "\2\2\u01c6\u01c5\3\2\2\2\u01c7\u01d0\3\2\2\2\u01c8\u01c9\f\4\2\2\u01c9"+
- "\u01ca\7\n\2\2\u01ca\u01cf\5.\30\5\u01cb\u01cc\f\3\2\2\u01cc\u01cd\7\66"+
- "\2\2\u01cd\u01cf\5.\30\4\u01ce\u01c8\3\2\2\2\u01ce\u01cb\3\2\2\2\u01cf"+
- "\u01d2\3\2\2\2\u01d0\u01ce\3\2\2\2\u01d0\u01d1\3\2\2\2\u01d1/\3\2\2\2"+
- "\u01d2\u01d0\3\2\2\2\u01d3\u01d4\7\5\2\2\u01d4\u01d6\5b\62\2\u01d5\u01d3"+
- "\3\2\2\2\u01d6\u01d9\3\2\2\2\u01d7\u01d5\3\2\2\2\u01d7\u01d8\3\2\2\2\u01d8"+
- "\61\3\2\2\2\u01d9\u01d7\3\2\2\2\u01da\u01dc\5<\37\2\u01db\u01dd\5\64\33"+
- "\2\u01dc\u01db\3\2\2\2\u01dc\u01dd\3\2\2\2\u01dd\63\3\2\2\2\u01de\u01e0"+
- "\7\61\2\2\u01df\u01de\3\2\2\2\u01df\u01e0\3\2\2\2\u01e0\u01e1\3\2\2\2"+
- "\u01e1\u01e2\7\16\2\2\u01e2\u01e3\5<\37\2\u01e3\u01e4\7\n\2\2\u01e4\u01e5"+
- "\5<\37\2\u01e5\u020d\3\2\2\2\u01e6\u01e8\7\61\2\2\u01e7\u01e6\3\2\2\2"+
- "\u01e7\u01e8\3\2\2\2\u01e8\u01e9\3\2\2\2\u01e9\u01ea\7&\2\2\u01ea\u01eb"+
- "\7\3\2\2\u01eb\u01f0\5,\27\2\u01ec\u01ed\7\5\2\2\u01ed\u01ef\5,\27\2\u01ee"+
- "\u01ec\3\2\2\2\u01ef\u01f2\3\2\2\2\u01f0\u01ee\3\2\2\2\u01f0\u01f1\3\2"+
- "\2\2\u01f1\u01f3\3\2\2\2\u01f2\u01f0\3\2\2\2\u01f3\u01f4\7\4\2\2\u01f4"+
- "\u020d\3\2\2\2\u01f5\u01f7\7\61\2\2\u01f6\u01f5\3\2\2\2\u01f6\u01f7\3"+
- "\2\2\2\u01f7\u01f8\3\2\2\2\u01f8\u01f9\7&\2\2\u01f9\u01fa\7\3\2\2\u01fa"+
- "\u01fb\5\b\5\2\u01fb\u01fc\7\4\2\2\u01fc\u020d\3\2\2\2\u01fd\u01ff\7\61"+
- "\2\2\u01fe\u01fd\3\2\2\2\u01fe\u01ff\3\2\2\2\u01ff\u0200\3\2\2\2\u0200"+
- "\u0201\7,\2\2\u0201\u020d\58\35\2\u0202\u0204\7\61\2\2\u0203\u0202\3\2"+
- "\2\2\u0203\u0204\3\2\2\2\u0204\u0205\3\2\2\2\u0205\u0206\7=\2\2\u0206"+
- "\u020d\5b\62\2\u0207\u0209\7(\2\2\u0208\u020a\7\61\2\2\u0209\u0208\3\2"+
- "\2\2\u0209\u020a\3\2\2\2\u020a\u020b\3\2\2\2\u020b\u020d\7\62\2\2\u020c"+
- "\u01df\3\2\2\2\u020c\u01e7\3\2\2\2\u020c\u01f6\3\2\2\2\u020c\u01fe\3\2"+
- "\2\2\u020c\u0203\3\2\2\2\u020c\u0207\3\2\2\2\u020d\65\3\2\2\2\u020e\u020f"+
- "\7,\2\2\u020f\u0210\58\35\2\u0210\67\3\2\2\2\u0211\u0213\5b\62\2\u0212"+
- "\u0214\5:\36\2\u0213\u0212\3\2\2\2\u0213\u0214\3\2\2\2\u02149\3\2\2\2"+
- "\u0215\u0216\7\30\2\2\u0216\u021c\5b\62\2\u0217\u0218\7M\2\2\u0218\u0219"+
- "\5b\62\2\u0219\u021a\7T\2\2\u021a\u021c\3\2\2\2\u021b\u0215\3\2\2\2\u021b"+
- "\u0217\3\2\2\2\u021c;\3\2\2\2\u021d\u021e\b\37\1\2\u021e\u0222\5> \2\u021f"+
- "\u0220\t\13\2\2\u0220\u0222\5<\37\6\u0221\u021d\3\2\2\2\u0221\u021f\3"+
- "\2\2\2\u0222\u022f\3\2\2\2\u0223\u0224\f\5\2\2\u0224\u0225\t\f\2\2\u0225"+
- "\u022e\5<\37\6\u0226\u0227\f\4\2\2\u0227\u0228\t\13\2\2\u0228\u022e\5"+
- "<\37\5\u0229\u022a\f\3\2\2\u022a\u022b\5P)\2\u022b\u022c\5<\37\4\u022c"+
- "\u022e\3\2\2\2\u022d\u0223\3\2\2\2\u022d\u0226\3\2\2\2\u022d\u0229\3\2"+
- "\2\2\u022e\u0231\3\2\2\2\u022f\u022d\3\2\2\2\u022f\u0230\3\2\2\2\u0230"+
- "=\3\2\2\2\u0231\u022f\3\2\2\2\u0232\u0246\5@!\2\u0233\u0246\5D#\2\u0234"+
- "\u0246\5N(\2\u0235\u0236\5V,\2\u0236\u0237\7a\2\2\u0237\u0239\3\2\2\2"+
- "\u0238\u0235\3\2\2\2\u0238\u0239\3\2\2\2\u0239\u023a\3\2\2\2\u023a\u0246"+
- "\7]\2\2\u023b\u0246\5H%\2\u023c\u023d\7\3\2\2\u023d\u023e\5\b\5\2\u023e"+
- "\u023f\7\4\2\2\u023f\u0246\3\2\2\2\u0240\u0246\5V,\2\u0241\u0242\7\3\2"+
- "\2\u0242\u0243\5,\27\2\u0243\u0244\7\4\2\2\u0244\u0246\3\2\2\2\u0245\u0232"+
- "\3\2\2\2\u0245\u0233\3\2\2\2\u0245\u0234\3\2\2\2\u0245\u0238\3\2\2\2\u0245"+
- "\u023b\3\2\2\2\u0245\u023c\3\2\2\2\u0245\u0240\3\2\2\2\u0245\u0241\3\2"+
- "\2\2\u0246?\3\2\2\2\u0247\u024d\5B\"\2\u0248\u0249\7N\2\2\u0249\u024a"+
- "\5B\"\2\u024a\u024b\7T\2\2\u024b\u024d\3\2\2\2\u024c\u0247\3\2\2\2\u024c"+
- "\u0248\3\2\2\2\u024dA\3\2\2\2\u024e\u024f\7\20\2\2\u024f\u0250\7\3\2\2"+
- "\u0250\u0251\5,\27\2\u0251\u0252\7\f\2\2\u0252\u0253\5T+\2\u0253\u0254"+
- "\7\4\2\2\u0254C\3\2\2\2\u0255\u025b\5F$\2\u0256\u0257\7N\2\2\u0257\u0258"+
- "\5F$\2\u0258\u0259\7T\2\2\u0259\u025b\3\2\2\2\u025a\u0255\3\2\2\2\u025a"+
- "\u0256\3\2\2\2\u025bE\3\2\2\2\u025c\u025d\7\34\2\2\u025d\u025e\7\3\2\2"+
- "\u025e\u025f\5X-\2\u025f\u0260\7 \2\2\u0260\u0261\5<\37\2\u0261\u0262"+
- "\7\4\2\2\u0262G\3\2\2\2\u0263\u0269\5J&\2\u0264\u0265\7N\2\2\u0265\u0266"+
- "\5J&\2\u0266\u0267\7T\2\2\u0267\u0269\3\2\2\2\u0268\u0263\3\2\2\2\u0268"+
- "\u0264\3\2\2\2\u0269I\3\2\2\2\u026a\u026b\5L\'\2\u026b\u0277\7\3\2\2\u026c"+
- "\u026e\5\36\20\2\u026d\u026c\3\2\2\2\u026d\u026e\3\2\2\2\u026e\u026f\3"+
- "\2\2\2\u026f\u0274\5,\27\2\u0270\u0271\7\5\2\2\u0271\u0273\5,\27\2\u0272"+
- "\u0270\3\2\2\2\u0273\u0276\3\2\2\2\u0274\u0272\3\2\2\2\u0274\u0275\3\2"+
- "\2\2\u0275\u0278\3\2\2\2\u0276\u0274\3\2\2\2\u0277\u026d\3\2\2\2\u0277"+
- "\u0278\3\2\2\2\u0278\u0279\3\2\2\2\u0279\u027a\7\4\2\2\u027aK\3\2\2\2"+
- "\u027b\u027f\7+\2\2\u027c\u027f\7<\2\2\u027d\u027f\5X-\2\u027e\u027b\3"+
- "\2\2\2\u027e\u027c\3\2\2\2\u027e\u027d\3\2\2\2\u027fM\3\2\2\2\u0280\u029a"+
- "\7\62\2\2\u0281\u029a\5`\61\2\u0282\u029a\5R*\2\u0283\u0285\7c\2\2\u0284"+
- "\u0283\3\2\2\2\u0285\u0286\3\2\2\2\u0286\u0284\3\2\2\2\u0286\u0287\3\2"+
- "\2\2\u0287\u029a\3\2\2\2\u0288\u029a\7b\2\2\u0289\u028a\7P\2\2\u028a\u028b"+
- "\5b\62\2\u028b\u028c\7T\2\2\u028c\u029a\3\2\2\2\u028d\u028e\7Q\2\2\u028e"+
- "\u028f\5b\62\2\u028f\u0290\7T\2\2\u0290\u029a\3\2\2\2\u0291\u0292\7R\2"+
- "\2\u0292\u0293\5b\62\2\u0293\u0294\7T\2\2\u0294\u029a\3\2\2\2\u0295\u0296"+
- "\7S\2\2\u0296\u0297\5b\62\2\u0297\u0298\7T\2\2\u0298\u029a\3\2\2\2\u0299"+
- "\u0280\3\2\2\2\u0299\u0281\3\2\2\2\u0299\u0282\3\2\2\2\u0299\u0284\3\2"+
- "\2\2\u0299\u0288\3\2\2\2\u0299\u0289\3\2\2\2\u0299\u028d\3\2\2\2\u0299"+
- "\u0291\3\2\2\2\u0299\u0295\3\2\2\2\u029aO\3\2\2\2\u029b\u029c\t\r\2\2"+
- "\u029cQ\3\2\2\2\u029d\u029e\t\16\2\2\u029eS\3\2\2\2\u029f\u02a0\5X-\2"+
- "\u02a0U\3\2\2\2\u02a1\u02a2\5X-\2\u02a2\u02a3\7a\2\2\u02a3\u02a5\3\2\2"+
- "\2\u02a4\u02a1\3\2\2\2\u02a5\u02a8\3\2\2\2\u02a6\u02a4\3\2\2\2\u02a6\u02a7"+
- "\3\2\2\2\u02a7\u02a9\3\2\2\2\u02a8\u02a6\3\2\2\2\u02a9\u02aa\5X-\2\u02aa"+
- "W\3\2\2\2\u02ab\u02ae\5\\/\2\u02ac\u02ae\5^\60\2\u02ad\u02ab\3\2\2\2\u02ad"+
- "\u02ac\3\2\2\2\u02aeY\3\2\2\2\u02af\u02b0\5X-\2\u02b0\u02b1\7\6\2\2\u02b1"+
- "\u02b3\3\2\2\2\u02b2\u02af\3\2\2\2\u02b2\u02b3\3\2\2\2\u02b3\u02b4\3\2"+
- "\2\2\u02b4\u02bc\7h\2\2\u02b5\u02b6\5X-\2\u02b6\u02b7\7\6\2\2\u02b7\u02b9"+
- "\3\2\2\2\u02b8\u02b5\3\2\2\2\u02b8\u02b9\3\2\2\2\u02b9\u02ba\3\2\2\2\u02ba"+
- "\u02bc\5X-\2\u02bb\u02b2\3\2\2\2\u02bb\u02b8\3\2\2\2\u02bc[\3\2\2\2\u02bd"+
- "\u02c0\7i\2\2\u02be\u02c0\7j\2\2\u02bf\u02bd\3\2\2\2\u02bf\u02be\3\2\2"+
- "\2\u02c0]\3\2\2\2\u02c1\u02c5\7f\2\2\u02c2\u02c5\5d\63\2\u02c3\u02c5\7"+
- "g\2\2\u02c4\u02c1\3\2\2\2\u02c4\u02c2\3\2\2\2\u02c4\u02c3\3\2\2\2\u02c5"+
- "_\3\2\2\2\u02c6\u02c9\7e\2\2\u02c7\u02c9\7d\2\2\u02c8\u02c6\3\2\2\2\u02c8"+
- "\u02c7\3\2\2\2\u02c9a\3\2\2\2\u02ca\u02cb\t\17\2\2\u02cbc\3\2\2\2\u02cc"+
- "\u02cd\t\20\2\2\u02cde\3\2\2\2auw{\u0084\u0086\u008a\u0091\u0098\u009d"+
- "\u00a2\u00ac\u00b0\u00b8\u00bb\u00c1\u00c6\u00c9\u00d0\u00d8\u00db\u00e7"+
- "\u00ea\u00ed\u00f4\u00fb\u00ff\u0103\u0107\u010e\u0112\u0116\u011b\u011f"+
- "\u0127\u012b\u0132\u013d\u0140\u0144\u0150\u0153\u0159\u0160\u0167\u016a"+
- "\u016e\u0172\u0176\u0178\u0183\u0188\u018c\u018f\u0195\u0198\u019e\u01a1"+
- "\u01a3\u01c6\u01ce\u01d0\u01d7\u01dc\u01df\u01e7\u01f0\u01f6\u01fe\u0203"+
- "\u0209\u020c\u0213\u021b\u0221\u022d\u022f\u0238\u0245\u024c\u025a\u0268"+
- "\u026d\u0274\u0277\u027e\u0286\u0299\u02a6\u02ad\u02b2\u02b8\u02bb\u02bf"+
- "\u02c4\u02c8";
+ "\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\3\30"+
+ "\3\30\3\30\3\30\5\30\u01c9\n\30\3\30\3\30\3\30\3\30\3\30\3\30\7\30\u01d1"+
+ "\n\30\f\30\16\30\u01d4\13\30\3\31\3\31\7\31\u01d8\n\31\f\31\16\31\u01db"+
+ "\13\31\3\32\3\32\5\32\u01df\n\32\3\33\5\33\u01e2\n\33\3\33\3\33\3\33\3"+
+ "\33\3\33\3\33\5\33\u01ea\n\33\3\33\3\33\3\33\3\33\3\33\7\33\u01f1\n\33"+
+ "\f\33\16\33\u01f4\13\33\3\33\3\33\3\33\5\33\u01f9\n\33\3\33\3\33\3\33"+
+ "\3\33\3\33\3\33\5\33\u0201\n\33\3\33\3\33\3\33\5\33\u0206\n\33\3\33\3"+
+ "\33\3\33\3\33\5\33\u020c\n\33\3\33\5\33\u020f\n\33\3\34\3\34\3\34\3\35"+
+ "\3\35\5\35\u0216\n\35\3\36\3\36\3\36\3\36\3\36\3\36\5\36\u021e\n\36\3"+
+ "\37\3\37\3\37\3\37\5\37\u0224\n\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37"+
+ "\3\37\3\37\3\37\7\37\u0230\n\37\f\37\16\37\u0233\13\37\3 \3 \3 \3 \3 "+
+ "\3 \5 \u023b\n \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \5 \u0248\n \3!\3!\3!"+
+ "\3!\3!\3!\3!\3!\3!\3!\5!\u0254\n!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3"+
+ "#\3#\3#\3#\3#\3$\3$\3$\3$\3$\5$\u0269\n$\3%\3%\3%\3%\3%\3%\3%\3&\3&\3"+
+ "&\3&\3&\5&\u0277\n&\3\'\3\'\3\'\5\'\u027c\n\'\3\'\3\'\3\'\7\'\u0281\n"+
+ "\'\f\'\16\'\u0284\13\'\5\'\u0286\n\'\3\'\3\'\3(\3(\3(\5(\u028d\n(\3)\3"+
+ ")\3)\3)\6)\u0293\n)\r)\16)\u0294\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3"+
+ ")\3)\3)\3)\3)\5)\u02a8\n)\3*\3*\3+\3+\3,\3,\3-\3-\3-\7-\u02b3\n-\f-\16"+
+ "-\u02b6\13-\3-\3-\3.\3.\5.\u02bc\n.\3/\3/\3/\5/\u02c1\n/\3/\3/\3/\3/\5"+
+ "/\u02c7\n/\3/\5/\u02ca\n/\3\60\3\60\5\60\u02ce\n\60\3\61\3\61\3\61\5\61"+
+ "\u02d3\n\61\3\62\3\62\5\62\u02d7\n\62\3\63\3\63\3\64\3\64\3\64\2\4.<\65"+
+ "\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFH"+
+ "JLNPRTVXZ\\^`bdf\2\21\b\2\7\7\t\t\32\32//\66\66::\4\2$$FF\4\2\t\t\66\66"+
+ "\4\2!!\'\'\3\2\26\27\4\2\7\7ee\4\2\r\r\26\26\4\2\37\37++\4\2\7\7\30\30"+
+ "\3\2\\]\3\2^`\3\2V[\4\2\36\36GG\3\2cd\21\2\b\t\22\23\25\25\32\32\34\34"+
+ " #$//\66\66:<>@BCEFHIKK\u0334\2h\3\2\2\2\4k\3\2\2\2\6\u00d2\3\2\2\2\b"+
+ "\u00dd\3\2\2\2\n\u00e1\3\2\2\2\f\u00f6\3\2\2\2\16\u00fd\3\2\2\2\20\u00ff"+
+ "\3\2\2\2\22\u0107\3\2\2\2\24\u0123\3\2\2\2\26\u012d\3\2\2\2\30\u0137\3"+
+ "\2\2\2\32\u0146\3\2\2\2\34\u0148\3\2\2\2\36\u014e\3\2\2\2 \u0150\3\2\2"+
+ "\2\"\u0157\3\2\2\2$\u0169\3\2\2\2&\u017a\3\2\2\2(\u018a\3\2\2\2*\u01a5"+
+ "\3\2\2\2,\u01a7\3\2\2\2.\u01c8\3\2\2\2\60\u01d9\3\2\2\2\62\u01dc\3\2\2"+
+ "\2\64\u020e\3\2\2\2\66\u0210\3\2\2\28\u0213\3\2\2\2:\u021d\3\2\2\2<\u0223"+
+ "\3\2\2\2>\u0247\3\2\2\2@\u0253\3\2\2\2B\u0255\3\2\2\2D\u025c\3\2\2\2F"+
+ "\u0268\3\2\2\2H\u026a\3\2\2\2J\u0276\3\2\2\2L\u0278\3\2\2\2N\u028c\3\2"+
+ "\2\2P\u02a7\3\2\2\2R\u02a9\3\2\2\2T\u02ab\3\2\2\2V\u02ad\3\2\2\2X\u02b4"+
+ "\3\2\2\2Z\u02bb\3\2\2\2\\\u02c9\3\2\2\2^\u02cd\3\2\2\2`\u02d2\3\2\2\2"+
+ "b\u02d6\3\2\2\2d\u02d8\3\2\2\2f\u02da\3\2\2\2hi\5\6\4\2ij\7\2\2\3j\3\3"+
+ "\2\2\2kl\5,\27\2lm\7\2\2\3m\5\3\2\2\2n\u00d3\5\b\5\2o}\7\34\2\2py\7\3"+
+ "\2\2qr\7<\2\2rx\t\2\2\2st\7 \2\2tx\t\3\2\2uv\7K\2\2vx\5T+\2wq\3\2\2\2"+
+ "ws\3\2\2\2wu\3\2\2\2x{\3\2\2\2yw\3\2\2\2yz\3\2\2\2z|\3\2\2\2{y\3\2\2\2"+
+ "|~\7\4\2\2}p\3\2\2\2}~\3\2\2\2~\177\3\2\2\2\177\u00d3\5\6\4\2\u0080\u008c"+
+ "\7\25\2\2\u0081\u0088\7\3\2\2\u0082\u0083\7<\2\2\u0083\u0087\t\4\2\2\u0084"+
+ "\u0085\7 \2\2\u0085\u0087\t\3\2\2\u0086\u0082\3\2\2\2\u0086\u0084\3\2"+
+ "\2\2\u0087\u008a\3\2\2\2\u0088\u0086\3\2\2\2\u0088\u0089\3\2\2\2\u0089"+
+ "\u008b\3\2\2\2\u008a\u0088\3\2\2\2\u008b\u008d\7\4\2\2\u008c\u0081\3\2"+
+ "\2\2\u008c\u008d\3\2\2\2\u008d\u008e\3\2\2\2\u008e\u00d3\5\6\4\2\u008f"+
+ "\u0090\7B\2\2\u0090\u0093\7E\2\2\u0091\u0094\5\66\34\2\u0092\u0094\5\\"+
+ "/\2\u0093\u0091\3\2\2\2\u0093\u0092\3\2\2\2\u0093\u0094\3\2\2\2\u0094"+
+ "\u00d3\3\2\2\2\u0095\u0096\7B\2\2\u0096\u0097\7\23\2\2\u0097\u009a\t\5"+
+ "\2\2\u0098\u009b\5\66\34\2\u0099\u009b\5\\/\2\u009a\u0098\3\2\2\2\u009a"+
+ "\u0099\3\2\2\2\u009b\u00d3\3\2\2\2\u009c\u009f\t\6\2\2\u009d\u00a0\5\66"+
+ "\34\2\u009e\u00a0\5\\/\2\u009f\u009d\3\2\2\2\u009f\u009e\3\2\2\2\u00a0"+
+ "\u00d3\3\2\2\2\u00a1\u00a2\7B\2\2\u00a2\u00a4\7#\2\2\u00a3\u00a5\5\66"+
+ "\34\2\u00a4\u00a3\3\2\2\2\u00a4\u00a5\3\2\2\2\u00a5\u00d3\3\2\2\2\u00a6"+
+ "\u00a7\7B\2\2\u00a7\u00d3\7@\2\2\u00a8\u00a9\7C\2\2\u00a9\u00d3\7\22\2"+
+ "\2\u00aa\u00ab\7C\2\2\u00ab\u00ae\7E\2\2\u00ac\u00ad\7\21\2\2\u00ad\u00af"+
+ "\5\66\34\2\u00ae\u00ac\3\2\2\2\u00ae\u00af\3\2\2\2\u00af\u00b2\3\2\2\2"+
+ "\u00b0\u00b3\5\66\34\2\u00b1\u00b3\5\\/\2\u00b2\u00b0\3\2\2\2\u00b2\u00b1"+
+ "\3\2\2\2\u00b2\u00b3\3\2\2\2\u00b3\u00bd\3\2\2\2\u00b4\u00b5\7H\2\2\u00b5"+
+ "\u00ba\5d\63\2\u00b6\u00b7\7\5\2\2\u00b7\u00b9\5d\63\2\u00b8\u00b6\3\2"+
+ "\2\2\u00b9\u00bc\3\2\2\2\u00ba\u00b8\3\2\2\2\u00ba\u00bb\3\2\2\2\u00bb"+
+ "\u00be\3\2\2\2\u00bc\u00ba\3\2\2\2\u00bd\u00b4\3\2\2\2\u00bd\u00be\3\2"+
+ "\2\2\u00be\u00d3\3\2\2\2\u00bf\u00c0\7C\2\2\u00c0\u00c3\7\23\2\2\u00c1"+
+ "\u00c2\7\21\2\2\u00c2\u00c4\5d\63\2\u00c3\u00c1\3\2\2\2\u00c3\u00c4\3"+
+ "\2\2\2\u00c4\u00c8\3\2\2\2\u00c5\u00c6\7D\2\2\u00c6\u00c9\5\66\34\2\u00c7"+
+ "\u00c9\5\\/\2\u00c8\u00c5\3\2\2\2\u00c8\u00c7\3\2\2\2\u00c8\u00c9\3\2"+
+ "\2\2\u00c9\u00cb\3\2\2\2\u00ca\u00cc\5\66\34\2\u00cb\u00ca\3\2\2\2\u00cb"+
+ "\u00cc\3\2\2\2\u00cc\u00d3\3\2\2\2\u00cd\u00ce\7C\2\2\u00ce\u00d3\7I\2"+
+ "\2\u00cf\u00d0\7C\2\2\u00d0\u00d1\7D\2\2\u00d1\u00d3\7I\2\2\u00d2n\3\2"+
+ "\2\2\u00d2o\3\2\2\2\u00d2\u0080\3\2\2\2\u00d2\u008f\3\2\2\2\u00d2\u0095"+
+ "\3\2\2\2\u00d2\u009c\3\2\2\2\u00d2\u00a1\3\2\2\2\u00d2\u00a6\3\2\2\2\u00d2"+
+ "\u00a8\3\2\2\2\u00d2\u00aa\3\2\2\2\u00d2\u00bf\3\2\2\2\u00d2\u00cd\3\2"+
+ "\2\2\u00d2\u00cf\3\2\2\2\u00d3\7\3\2\2\2\u00d4\u00d5\7M\2\2\u00d5\u00da"+
+ "\5\34\17\2\u00d6\u00d7\7\5\2\2\u00d7\u00d9\5\34\17\2\u00d8\u00d6\3\2\2"+
+ "\2\u00d9\u00dc\3\2\2\2\u00da\u00d8\3\2\2\2\u00da\u00db\3\2\2\2\u00db\u00de"+
+ "\3\2\2\2\u00dc\u00da\3\2\2\2\u00dd\u00d4\3\2\2\2\u00dd\u00de\3\2\2\2\u00de"+
+ "\u00df\3\2\2\2\u00df\u00e0\5\n\6\2\u00e0\t\3\2\2\2\u00e1\u00ec\5\16\b"+
+ "\2\u00e2\u00e3\78\2\2\u00e3\u00e4\7\17\2\2\u00e4\u00e9\5\20\t\2\u00e5"+
+ "\u00e6\7\5\2\2\u00e6\u00e8\5\20\t\2\u00e7\u00e5\3\2\2\2\u00e8\u00eb\3"+
+ "\2\2\2\u00e9\u00e7\3\2\2\2\u00e9\u00ea\3\2\2\2\u00ea\u00ed\3\2\2\2\u00eb"+
+ "\u00e9\3\2\2\2\u00ec\u00e2\3\2\2\2\u00ec\u00ed\3\2\2\2\u00ed\u00ef\3\2"+
+ "\2\2\u00ee\u00f0\5\f\7\2\u00ef\u00ee\3\2\2\2\u00ef\u00f0\3\2\2\2\u00f0"+
+ "\13\3\2\2\2\u00f1\u00f2\7.\2\2\u00f2\u00f7\t\7\2\2\u00f3\u00f4\7P\2\2"+
+ "\u00f4\u00f5\t\7\2\2\u00f5\u00f7\7U\2\2\u00f6\u00f1\3\2\2\2\u00f6\u00f3"+
+ "\3\2\2\2\u00f7\r\3\2\2\2\u00f8\u00fe\5\22\n\2\u00f9\u00fa\7\3\2\2\u00fa"+
+ "\u00fb\5\n\6\2\u00fb\u00fc\7\4\2\2\u00fc\u00fe\3\2\2\2\u00fd\u00f8\3\2"+
+ "\2\2\u00fd\u00f9\3\2\2\2\u00fe\17\3\2\2\2\u00ff\u0101\5,\27\2\u0100\u0102"+
+ "\t\b\2\2\u0101\u0100\3\2\2\2\u0101\u0102\3\2\2\2\u0102\u0105\3\2\2\2\u0103"+
+ "\u0104\7\64\2\2\u0104\u0106\t\t\2\2\u0105\u0103\3\2\2\2\u0105\u0106\3"+
+ "\2\2\2\u0106\21\3\2\2\2\u0107\u0109\7A\2\2\u0108\u010a\5\36\20\2\u0109"+
+ "\u0108\3\2\2\2\u0109\u010a\3\2\2\2\u010a\u010b\3\2\2\2\u010b\u0110\5 "+
+ "\21\2\u010c\u010d\7\5\2\2\u010d\u010f\5 \21\2\u010e\u010c\3\2\2\2\u010f"+
+ "\u0112\3\2\2\2\u0110\u010e\3\2\2\2\u0110\u0111\3\2\2\2\u0111\u0114\3\2"+
+ "\2\2\u0112\u0110\3\2\2\2\u0113\u0115\5\24\13\2\u0114\u0113\3\2\2\2\u0114"+
+ "\u0115\3\2\2\2\u0115\u0118\3\2\2\2\u0116\u0117\7L\2\2\u0117\u0119\5.\30"+
+ "\2\u0118\u0116\3\2\2\2\u0118\u0119\3\2\2\2\u0119\u011d\3\2\2\2\u011a\u011b"+
+ "\7%\2\2\u011b\u011c\7\17\2\2\u011c\u011e\5\26\f\2\u011d\u011a\3\2\2\2"+
+ "\u011d\u011e\3\2\2\2\u011e\u0121\3\2\2\2\u011f\u0120\7&\2\2\u0120\u0122"+
+ "\5.\30\2\u0121\u011f\3\2\2\2\u0121\u0122\3\2\2\2\u0122\23\3\2\2\2\u0123"+
+ "\u0124\7!\2\2\u0124\u0129\5\"\22\2\u0125\u0126\7\5\2\2\u0126\u0128\5\""+
+ "\22\2\u0127\u0125\3\2\2\2\u0128\u012b\3\2\2\2\u0129\u0127\3\2\2\2\u0129"+
+ "\u012a\3\2\2\2\u012a\25\3\2\2\2\u012b\u0129\3\2\2\2\u012c\u012e\5\36\20"+
+ "\2\u012d\u012c\3\2\2\2\u012d\u012e\3\2\2\2\u012e\u012f\3\2\2\2\u012f\u0134"+
+ "\5\30\r\2\u0130\u0131\7\5\2\2\u0131\u0133\5\30\r\2\u0132\u0130\3\2\2\2"+
+ "\u0133\u0136\3\2\2\2\u0134\u0132\3\2\2\2\u0134\u0135\3\2\2\2\u0135\27"+
+ "\3\2\2\2\u0136\u0134\3\2\2\2\u0137\u0138\5\32\16\2\u0138\31\3\2\2\2\u0139"+
+ "\u0142\7\3\2\2\u013a\u013f\5,\27\2\u013b\u013c\7\5\2\2\u013c\u013e\5,"+
+ "\27\2\u013d\u013b\3\2\2\2\u013e\u0141\3\2\2\2\u013f\u013d\3\2\2\2\u013f"+
+ "\u0140\3\2\2\2\u0140\u0143\3\2\2\2\u0141\u013f\3\2\2\2\u0142\u013a\3\2"+
+ "\2\2\u0142\u0143\3\2\2\2\u0143\u0144\3\2\2\2\u0144\u0147\7\4\2\2\u0145"+
+ "\u0147\5,\27\2\u0146\u0139\3\2\2\2\u0146\u0145\3\2\2\2\u0147\33\3\2\2"+
+ "\2\u0148\u0149\5Z.\2\u0149\u014a\7\f\2\2\u014a\u014b\7\3\2\2\u014b\u014c"+
+ "\5\n\6\2\u014c\u014d\7\4\2\2\u014d\35\3\2\2\2\u014e\u014f\t\n\2\2\u014f"+
+ "\37\3\2\2\2\u0150\u0155\5,\27\2\u0151\u0153\7\f\2\2\u0152\u0151\3\2\2"+
+ "\2\u0152\u0153\3\2\2\2\u0153\u0154\3\2\2\2\u0154\u0156\5Z.\2\u0155\u0152"+
+ "\3\2\2\2\u0155\u0156\3\2\2\2\u0156!\3\2\2\2\u0157\u015b\5*\26\2\u0158"+
+ "\u015a\5$\23\2\u0159\u0158\3\2\2\2\u015a\u015d\3\2\2\2\u015b\u0159\3\2"+
+ "\2\2\u015b\u015c\3\2\2\2\u015c#\3\2\2\2\u015d\u015b\3\2\2\2\u015e\u015f"+
+ "\5&\24\2\u015f\u0160\7*\2\2\u0160\u0162\5*\26\2\u0161\u0163\5(\25\2\u0162"+
+ "\u0161\3\2\2\2\u0162\u0163\3\2\2\2\u0163\u016a\3\2\2\2\u0164\u0165\7\61"+
+ "\2\2\u0165\u0166\5&\24\2\u0166\u0167\7*\2\2\u0167\u0168\5*\26\2\u0168"+
+ "\u016a\3\2\2\2\u0169\u015e\3\2\2\2\u0169\u0164\3\2\2\2\u016a%\3\2\2\2"+
+ "\u016b\u016d\7(\2\2\u016c\u016b\3\2\2\2\u016c\u016d\3\2\2\2\u016d\u017b"+
+ "\3\2\2\2\u016e\u0170\7,\2\2\u016f\u0171\79\2\2\u0170\u016f\3\2\2\2\u0170"+
+ "\u0171\3\2\2\2\u0171\u017b\3\2\2\2\u0172\u0174\7=\2\2\u0173\u0175\79\2"+
+ "\2\u0174\u0173\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u017b\3\2\2\2\u0176\u0178"+
+ "\7\"\2\2\u0177\u0179\79\2\2\u0178\u0177\3\2\2\2\u0178\u0179\3\2\2\2\u0179"+
+ "\u017b\3\2\2\2\u017a\u016c\3\2\2\2\u017a\u016e\3\2\2\2\u017a\u0172\3\2"+
+ "\2\2\u017a\u0176\3\2\2\2\u017b\'\3\2\2\2\u017c\u017d\7\65\2\2\u017d\u018b"+
+ "\5.\30\2\u017e\u017f\7J\2\2\u017f\u0180\7\3\2\2\u0180\u0185\5Z.\2\u0181"+
+ "\u0182\7\5\2\2\u0182\u0184\5Z.\2\u0183\u0181\3\2\2\2\u0184\u0187\3\2\2"+
+ "\2\u0185\u0183\3\2\2\2\u0185\u0186\3\2\2\2\u0186\u0188\3\2\2\2\u0187\u0185"+
+ "\3\2\2\2\u0188\u0189\7\4\2\2\u0189\u018b\3\2\2\2\u018a\u017c\3\2\2\2\u018a"+
+ "\u017e\3\2\2\2\u018b)\3\2\2\2\u018c\u0191\5\\/\2\u018d\u018f\7\f\2\2\u018e"+
+ "\u018d\3\2\2\2\u018e\u018f\3\2\2\2\u018f\u0190\3\2\2\2\u0190\u0192\5X"+
+ "-\2\u0191\u018e\3\2\2\2\u0191\u0192\3\2\2\2\u0192\u01a6\3\2\2\2\u0193"+
+ "\u0194\7\3\2\2\u0194\u0195\5\n\6\2\u0195\u019a\7\4\2\2\u0196\u0198\7\f"+
+ "\2\2\u0197\u0196\3\2\2\2\u0197\u0198\3\2\2\2\u0198\u0199\3\2\2\2\u0199"+
+ "\u019b\5X-\2\u019a\u0197\3\2\2\2\u019a\u019b\3\2\2\2\u019b\u01a6\3\2\2"+
+ "\2\u019c\u019d\7\3\2\2\u019d\u019e\5\"\22\2\u019e\u01a3\7\4\2\2\u019f"+
+ "\u01a1\7\f\2\2\u01a0\u019f\3\2\2\2\u01a0\u01a1\3\2\2\2\u01a1\u01a2\3\2"+
+ "\2\2\u01a2\u01a4\5X-\2\u01a3\u01a0\3\2\2\2\u01a3\u01a4\3\2\2\2\u01a4\u01a6"+
+ "\3\2\2\2\u01a5\u018c\3\2\2\2\u01a5\u0193\3\2\2\2\u01a5\u019c\3\2\2\2\u01a6"+
+ "+\3\2\2\2\u01a7\u01a8\5.\30\2\u01a8-\3\2\2\2\u01a9\u01aa\b\30\1\2\u01aa"+
+ "\u01ab\7\62\2\2\u01ab\u01c9\5.\30\n\u01ac\u01ad\7\33\2\2\u01ad\u01ae\7"+
+ "\3\2\2\u01ae\u01af\5\b\5\2\u01af\u01b0\7\4\2\2\u01b0\u01c9\3\2\2\2\u01b1"+
+ "\u01b2\7?\2\2\u01b2\u01b3\7\3\2\2\u01b3\u01b4\5d\63\2\u01b4\u01b5\5\60"+
+ "\31\2\u01b5\u01b6\7\4\2\2\u01b6\u01c9\3\2\2\2\u01b7\u01b8\7\60\2\2\u01b8"+
+ "\u01b9\7\3\2\2\u01b9\u01ba\5X-\2\u01ba\u01bb\7\5\2\2\u01bb\u01bc\5d\63"+
+ "\2\u01bc\u01bd\5\60\31\2\u01bd\u01be\7\4\2\2\u01be\u01c9\3\2\2\2\u01bf"+
+ "\u01c0\7\60\2\2\u01c0\u01c1\7\3\2\2\u01c1\u01c2\5d\63\2\u01c2\u01c3\7"+
+ "\5\2\2\u01c3\u01c4\5d\63\2\u01c4\u01c5\5\60\31\2\u01c5\u01c6\7\4\2\2\u01c6"+
+ "\u01c9\3\2\2\2\u01c7\u01c9\5\62\32\2\u01c8\u01a9\3\2\2\2\u01c8\u01ac\3"+
+ "\2\2\2\u01c8\u01b1\3\2\2\2\u01c8\u01b7\3\2\2\2\u01c8\u01bf\3\2\2\2\u01c8"+
+ "\u01c7\3\2\2\2\u01c9\u01d2\3\2\2\2\u01ca\u01cb\f\4\2\2\u01cb\u01cc\7\n"+
+ "\2\2\u01cc\u01d1\5.\30\5\u01cd\u01ce\f\3\2\2\u01ce\u01cf\7\67\2\2\u01cf"+
+ "\u01d1\5.\30\4\u01d0\u01ca\3\2\2\2\u01d0\u01cd\3\2\2\2\u01d1\u01d4\3\2"+
+ "\2\2\u01d2\u01d0\3\2\2\2\u01d2\u01d3\3\2\2\2\u01d3/\3\2\2\2\u01d4\u01d2"+
+ "\3\2\2\2\u01d5\u01d6\7\5\2\2\u01d6\u01d8\5d\63\2\u01d7\u01d5\3\2\2\2\u01d8"+
+ "\u01db\3\2\2\2\u01d9\u01d7\3\2\2\2\u01d9\u01da\3\2\2\2\u01da\61\3\2\2"+
+ "\2\u01db\u01d9\3\2\2\2\u01dc\u01de\5<\37\2\u01dd\u01df\5\64\33\2\u01de"+
+ "\u01dd\3\2\2\2\u01de\u01df\3\2\2\2\u01df\63\3\2\2\2\u01e0\u01e2\7\62\2"+
+ "\2\u01e1\u01e0\3\2\2\2\u01e1\u01e2\3\2\2\2\u01e2\u01e3\3\2\2\2\u01e3\u01e4"+
+ "\7\16\2\2\u01e4\u01e5\5<\37\2\u01e5\u01e6\7\n\2\2\u01e6\u01e7\5<\37\2"+
+ "\u01e7\u020f\3\2\2\2\u01e8\u01ea\7\62\2\2\u01e9\u01e8\3\2\2\2\u01e9\u01ea"+
+ "\3\2\2\2\u01ea\u01eb\3\2\2\2\u01eb\u01ec\7\'\2\2\u01ec\u01ed\7\3\2\2\u01ed"+
+ "\u01f2\5,\27\2\u01ee\u01ef\7\5\2\2\u01ef\u01f1\5,\27\2\u01f0\u01ee\3\2"+
+ "\2\2\u01f1\u01f4\3\2\2\2\u01f2\u01f0\3\2\2\2\u01f2\u01f3\3\2\2\2\u01f3"+
+ "\u01f5\3\2\2\2\u01f4\u01f2\3\2\2\2\u01f5\u01f6\7\4\2\2\u01f6\u020f\3\2"+
+ "\2\2\u01f7\u01f9\7\62\2\2\u01f8\u01f7\3\2\2\2\u01f8\u01f9\3\2\2\2\u01f9"+
+ "\u01fa\3\2\2\2\u01fa\u01fb\7\'\2\2\u01fb\u01fc\7\3\2\2\u01fc\u01fd\5\b"+
+ "\5\2\u01fd\u01fe\7\4\2\2\u01fe\u020f\3\2\2\2\u01ff\u0201\7\62\2\2\u0200"+
+ "\u01ff\3\2\2\2\u0200\u0201\3\2\2\2\u0201\u0202\3\2\2\2\u0202\u0203\7-"+
+ "\2\2\u0203\u020f\58\35\2\u0204\u0206\7\62\2\2\u0205\u0204\3\2\2\2\u0205"+
+ "\u0206\3\2\2\2\u0206\u0207\3\2\2\2\u0207\u0208\7>\2\2\u0208\u020f\5d\63"+
+ "\2\u0209\u020b\7)\2\2\u020a\u020c\7\62\2\2\u020b\u020a\3\2\2\2\u020b\u020c"+
+ "\3\2\2\2\u020c\u020d\3\2\2\2\u020d\u020f\7\63\2\2\u020e\u01e1\3\2\2\2"+
+ "\u020e\u01e9\3\2\2\2\u020e\u01f8\3\2\2\2\u020e\u0200\3\2\2\2\u020e\u0205"+
+ "\3\2\2\2\u020e\u0209\3\2\2\2\u020f\65\3\2\2\2\u0210\u0211\7-\2\2\u0211"+
+ "\u0212\58\35\2\u0212\67\3\2\2\2\u0213\u0215\5d\63\2\u0214\u0216\5:\36"+
+ "\2\u0215\u0214\3\2\2\2\u0215\u0216\3\2\2\2\u02169\3\2\2\2\u0217\u0218"+
+ "\7\31\2\2\u0218\u021e\5d\63\2\u0219\u021a\7N\2\2\u021a\u021b\5d\63\2\u021b"+
+ "\u021c\7U\2\2\u021c\u021e\3\2\2\2\u021d\u0217\3\2\2\2\u021d\u0219\3\2"+
+ "\2\2\u021e;\3\2\2\2\u021f\u0220\b\37\1\2\u0220\u0224\5> \2\u0221\u0222"+
+ "\t\13\2\2\u0222\u0224\5<\37\6\u0223\u021f\3\2\2\2\u0223\u0221\3\2\2\2"+
+ "\u0224\u0231\3\2\2\2\u0225\u0226\f\5\2\2\u0226\u0227\t\f\2\2\u0227\u0230"+
+ "\5<\37\6\u0228\u0229\f\4\2\2\u0229\u022a\t\13\2\2\u022a\u0230\5<\37\5"+
+ "\u022b\u022c\f\3\2\2\u022c\u022d\5R*\2\u022d\u022e\5<\37\4\u022e\u0230"+
+ "\3\2\2\2\u022f\u0225\3\2\2\2\u022f\u0228\3\2\2\2\u022f\u022b\3\2\2\2\u0230"+
+ "\u0233\3\2\2\2\u0231\u022f\3\2\2\2\u0231\u0232\3\2\2\2\u0232=\3\2\2\2"+
+ "\u0233\u0231\3\2\2\2\u0234\u0248\5@!\2\u0235\u0248\5F$\2\u0236\u0248\5"+
+ "P)\2\u0237\u0238\5X-\2\u0238\u0239\7b\2\2\u0239\u023b\3\2\2\2\u023a\u0237"+
+ "\3\2\2\2\u023a\u023b\3\2\2\2\u023b\u023c\3\2\2\2\u023c\u0248\7^\2\2\u023d"+
+ "\u0248\5J&\2\u023e\u023f\7\3\2\2\u023f\u0240\5\b\5\2\u0240\u0241\7\4\2"+
+ "\2\u0241\u0248\3\2\2\2\u0242\u0248\5X-\2\u0243\u0244\7\3\2\2\u0244\u0245"+
+ "\5,\27\2\u0245\u0246\7\4\2\2\u0246\u0248\3\2\2\2\u0247\u0234\3\2\2\2\u0247"+
+ "\u0235\3\2\2\2\u0247\u0236\3\2\2\2\u0247\u023a\3\2\2\2\u0247\u023d\3\2"+
+ "\2\2\u0247\u023e\3\2\2\2\u0247\u0242\3\2\2\2\u0247\u0243\3\2\2\2\u0248"+
+ "?\3\2\2\2\u0249\u0254\5B\"\2\u024a\u024b\7O\2\2\u024b\u024c\5B\"\2\u024c"+
+ "\u024d\7U\2\2\u024d\u0254\3\2\2\2\u024e\u0254\5D#\2\u024f\u0250\7O\2\2"+
+ "\u0250\u0251\5D#\2\u0251\u0252\7U\2\2\u0252\u0254\3\2\2\2\u0253\u0249"+
+ "\3\2\2\2\u0253\u024a\3\2\2\2\u0253\u024e\3\2\2\2\u0253\u024f\3\2\2\2\u0254"+
+ "A\3\2\2\2\u0255\u0256\7\20\2\2\u0256\u0257\7\3\2\2\u0257\u0258\5,\27\2"+
+ "\u0258\u0259\7\f\2\2\u0259\u025a\5V,\2\u025a\u025b\7\4\2\2\u025bC\3\2"+
+ "\2\2\u025c\u025d\7\24\2\2\u025d\u025e\7\3\2\2\u025e\u025f\5,\27\2\u025f"+
+ "\u0260\7\5\2\2\u0260\u0261\5V,\2\u0261\u0262\7\4\2\2\u0262E\3\2\2\2\u0263"+
+ "\u0269\5H%\2\u0264\u0265\7O\2\2\u0265\u0266\5H%\2\u0266\u0267\7U\2\2\u0267"+
+ "\u0269\3\2\2\2\u0268\u0263\3\2\2\2\u0268\u0264\3\2\2\2\u0269G\3\2\2\2"+
+ "\u026a\u026b\7\35\2\2\u026b\u026c\7\3\2\2\u026c\u026d\5Z.\2\u026d\u026e"+
+ "\7!\2\2\u026e\u026f\5<\37\2\u026f\u0270\7\4\2\2\u0270I\3\2\2\2\u0271\u0277"+
+ "\5L\'\2\u0272\u0273\7O\2\2\u0273\u0274\5L\'\2\u0274\u0275\7U\2\2\u0275"+
+ "\u0277\3\2\2\2\u0276\u0271\3\2\2\2\u0276\u0272\3\2\2\2\u0277K\3\2\2\2"+
+ "\u0278\u0279\5N(\2\u0279\u0285\7\3\2\2\u027a\u027c\5\36\20\2\u027b\u027a"+
+ "\3\2\2\2\u027b\u027c\3\2\2\2\u027c\u027d\3\2\2\2\u027d\u0282\5,\27\2\u027e"+
+ "\u027f\7\5\2\2\u027f\u0281\5,\27\2\u0280\u027e\3\2\2\2\u0281\u0284\3\2"+
+ "\2\2\u0282\u0280\3\2\2\2\u0282\u0283\3\2\2\2\u0283\u0286\3\2\2\2\u0284"+
+ "\u0282\3\2\2\2\u0285\u027b\3\2\2\2\u0285\u0286\3\2\2\2\u0286\u0287\3\2"+
+ "\2\2\u0287\u0288\7\4\2\2\u0288M\3\2\2\2\u0289\u028d\7,\2\2\u028a\u028d"+
+ "\7=\2\2\u028b\u028d\5Z.\2\u028c\u0289\3\2\2\2\u028c\u028a\3\2\2\2\u028c"+
+ "\u028b\3\2\2\2\u028dO\3\2\2\2\u028e\u02a8\7\63\2\2\u028f\u02a8\5b\62\2"+
+ "\u0290\u02a8\5T+\2\u0291\u0293\7d\2\2\u0292\u0291\3\2\2\2\u0293\u0294"+
+ "\3\2\2\2\u0294\u0292\3\2\2\2\u0294\u0295\3\2\2\2\u0295\u02a8\3\2\2\2\u0296"+
+ "\u02a8\7c\2\2\u0297\u0298\7Q\2\2\u0298\u0299\5d\63\2\u0299\u029a\7U\2"+
+ "\2\u029a\u02a8\3\2\2\2\u029b\u029c\7R\2\2\u029c\u029d\5d\63\2\u029d\u029e"+
+ "\7U\2\2\u029e\u02a8\3\2\2\2\u029f\u02a0\7S\2\2\u02a0\u02a1\5d\63\2\u02a1"+
+ "\u02a2\7U\2\2\u02a2\u02a8\3\2\2\2\u02a3\u02a4\7T\2\2\u02a4\u02a5\5d\63"+
+ "\2\u02a5\u02a6\7U\2\2\u02a6\u02a8\3\2\2\2\u02a7\u028e\3\2\2\2\u02a7\u028f"+
+ "\3\2\2\2\u02a7\u0290\3\2\2\2\u02a7\u0292\3\2\2\2\u02a7\u0296\3\2\2\2\u02a7"+
+ "\u0297\3\2\2\2\u02a7\u029b\3\2\2\2\u02a7\u029f\3\2\2\2\u02a7\u02a3\3\2"+
+ "\2\2\u02a8Q\3\2\2\2\u02a9\u02aa\t\r\2\2\u02aaS\3\2\2\2\u02ab\u02ac\t\16"+
+ "\2\2\u02acU\3\2\2\2\u02ad\u02ae\5Z.\2\u02aeW\3\2\2\2\u02af\u02b0\5Z.\2"+
+ "\u02b0\u02b1\7b\2\2\u02b1\u02b3\3\2\2\2\u02b2\u02af\3\2\2\2\u02b3\u02b6"+
+ "\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b4\u02b5\3\2\2\2\u02b5\u02b7\3\2\2\2\u02b6"+
+ "\u02b4\3\2\2\2\u02b7\u02b8\5Z.\2\u02b8Y\3\2\2\2\u02b9\u02bc\5^\60\2\u02ba"+
+ "\u02bc\5`\61\2\u02bb\u02b9\3\2\2\2\u02bb\u02ba\3\2\2\2\u02bc[\3\2\2\2"+
+ "\u02bd\u02be\5Z.\2\u02be\u02bf\7\6\2\2\u02bf\u02c1\3\2\2\2\u02c0\u02bd"+
+ "\3\2\2\2\u02c0\u02c1\3\2\2\2\u02c1\u02c2\3\2\2\2\u02c2\u02ca\7i\2\2\u02c3"+
+ "\u02c4\5Z.\2\u02c4\u02c5\7\6\2\2\u02c5\u02c7\3\2\2\2\u02c6\u02c3\3\2\2"+
+ "\2\u02c6\u02c7\3\2\2\2\u02c7\u02c8\3\2\2\2\u02c8\u02ca\5Z.\2\u02c9\u02c0"+
+ "\3\2\2\2\u02c9\u02c6\3\2\2\2\u02ca]\3\2\2\2\u02cb\u02ce\7j\2\2\u02cc\u02ce"+
+ "\7k\2\2\u02cd\u02cb\3\2\2\2\u02cd\u02cc\3\2\2\2\u02ce_\3\2\2\2\u02cf\u02d3"+
+ "\7g\2\2\u02d0\u02d3\5f\64\2\u02d1\u02d3\7h\2\2\u02d2\u02cf\3\2\2\2\u02d2"+
+ "\u02d0\3\2\2\2\u02d2\u02d1\3\2\2\2\u02d3a\3\2\2\2\u02d4\u02d7\7f\2\2\u02d5"+
+ "\u02d7\7e\2\2\u02d6\u02d4\3\2\2\2\u02d6\u02d5\3\2\2\2\u02d7c\3\2\2\2\u02d8"+
+ "\u02d9\t\17\2\2\u02d9e\3\2\2\2\u02da\u02db\t\20\2\2\u02dbg\3\2\2\2awy"+
+ "}\u0086\u0088\u008c\u0093\u009a\u009f\u00a4\u00ae\u00b2\u00ba\u00bd\u00c3"+
+ "\u00c8\u00cb\u00d2\u00da\u00dd\u00e9\u00ec\u00ef\u00f6\u00fd\u0101\u0105"+
+ "\u0109\u0110\u0114\u0118\u011d\u0121\u0129\u012d\u0134\u013f\u0142\u0146"+
+ "\u0152\u0155\u015b\u0162\u0169\u016c\u0170\u0174\u0178\u017a\u0185\u018a"+
+ "\u018e\u0191\u0197\u019a\u01a0\u01a3\u01a5\u01c8\u01d0\u01d2\u01d9\u01de"+
+ "\u01e1\u01e9\u01f2\u01f8\u0200\u0205\u020b\u020e\u0215\u021d\u0223\u022f"+
+ "\u0231\u023a\u0247\u0253\u0268\u0276\u027b\u0282\u0285\u028c\u0294\u02a7"+
+ "\u02b4\u02bb\u02c0\u02c6\u02c9\u02cd\u02d2\u02d6";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseVisitor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseVisitor.java
index afb4747ae49..f4420a66adb 100644
--- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseVisitor.java
+++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseVisitor.java
@@ -426,6 +426,12 @@ interface SqlBaseVisitor extends ParseTreeVisitor {
* @return the visitor result
*/
T visitCastTemplate(SqlBaseParser.CastTemplateContext ctx);
+ /**
+ * Visit a parse tree produced by {@link SqlBaseParser#convertTemplate}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitConvertTemplate(SqlBaseParser.ConvertTemplateContext ctx);
/**
* Visit a parse tree produced by {@link SqlBaseParser#extractExpression}.
* @param ctx the parse tree
diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/parser/ExpressionTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/parser/ExpressionTests.java
index 122da8fa3a6..0ee0c9bcca1 100644
--- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/parser/ExpressionTests.java
+++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/parser/ExpressionTests.java
@@ -9,6 +9,7 @@ import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.xpack.sql.expression.Expression;
import org.elasticsearch.xpack.sql.expression.Literal;
import org.elasticsearch.xpack.sql.expression.function.UnresolvedFunction;
+import org.elasticsearch.xpack.sql.expression.function.scalar.Cast;
import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Add;
import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Mul;
import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Neg;
@@ -156,4 +157,89 @@ public class ExpressionTests extends ESTestCase {
assertEquals(Literal.class, sub2.children().get(1).getClass());
assertEquals("2", ((Literal) sub2.children().get(1)).name());
}
+
+ public void testCastWithUnquotedDataType() {
+ Expression expr = parser.createExpression("CAST(10*2 AS long)");
+ assertEquals(Cast.class, expr.getClass());
+ Cast cast = (Cast) expr;
+ assertEquals(DataType.INTEGER, cast.from());
+ assertEquals(DataType.LONG, cast.to());
+ assertEquals(DataType.LONG, cast.dataType());
+ assertEquals(Mul.class, cast.field().getClass());
+ Mul mul = (Mul) cast.field();
+ assertEquals("10 * 2", mul.name());
+ assertEquals(DataType.INTEGER, mul.dataType());
+ }
+
+ public void testCastWithQuotedDataType() {
+ Expression expr = parser.createExpression("CAST(10*2 AS \"LonG\")");
+ assertEquals(Cast.class, expr.getClass());
+ Cast cast = (Cast) expr;
+ assertEquals(DataType.INTEGER, cast.from());
+ assertEquals(DataType.LONG, cast.to());
+ assertEquals(DataType.LONG, cast.dataType());
+ assertEquals(Mul.class, cast.field().getClass());
+ Mul mul = (Mul) cast.field();
+ assertEquals("10 * 2", mul.name());
+ assertEquals(DataType.INTEGER, mul.dataType());
+ }
+
+ public void testCastWithInvalidDataType() {
+ ParsingException ex = expectThrows(ParsingException.class, () -> parser.createExpression("CAST(1 AS INVALID)"));
+ assertEquals("line 1:12: Does not recognize type invalid", ex.getMessage());
+ }
+
+ public void testConvertWithUnquotedDataType() {
+ Expression expr = parser.createExpression("CONVERT(10*2, long)");
+ assertEquals(Cast.class, expr.getClass());
+ Cast cast = (Cast) expr;
+ assertEquals(DataType.INTEGER, cast.from());
+ assertEquals(DataType.LONG, cast.to());
+ assertEquals(DataType.LONG, cast.dataType());
+ assertEquals(Mul.class, cast.field().getClass());
+ Mul mul = (Mul) cast.field();
+ assertEquals("10 * 2", mul.name());
+ assertEquals(DataType.INTEGER, mul.dataType());
+ }
+
+ public void testConvertWithQuotedDataType() {
+ Expression expr = parser.createExpression("CONVERT(10*2, \"LonG\")");
+ assertEquals(Cast.class, expr.getClass());
+ Cast cast = (Cast) expr;
+ assertEquals(DataType.INTEGER, cast.from());
+ assertEquals(DataType.LONG, cast.to());
+ assertEquals(DataType.LONG, cast.dataType());
+ assertEquals(Mul.class, cast.field().getClass());
+ Mul mul = (Mul) cast.field();
+ assertEquals("10 * 2", mul.name());
+ assertEquals(DataType.INTEGER, mul.dataType());
+ }
+
+ public void testConvertWithUnquotedODBCDataType() {
+ Expression expr = parser.createExpression("CONVERT(1, Sql_BigInt)");
+ assertEquals(Cast.class, expr.getClass());
+ Cast cast = (Cast) expr;
+ assertEquals(DataType.INTEGER, cast.from());
+ assertEquals(DataType.LONG, cast.to());
+ assertEquals(DataType.LONG, cast.dataType());
+ }
+
+ public void testConvertWithQuotedODBCDataType() {
+ Expression expr = parser.createExpression("CONVERT(1, \"sql_BIGint\")");
+ assertEquals(Cast.class, expr.getClass());
+ Cast cast = (Cast) expr;
+ assertEquals(DataType.INTEGER, cast.from());
+ assertEquals(DataType.LONG, cast.to());
+ assertEquals(DataType.LONG, cast.dataType());
+ }
+
+ public void testConvertWithInvalidODBCDataType() {
+ ParsingException ex = expectThrows(ParsingException.class, () -> parser.createExpression("CONVERT(1, SQL_INVALID)"));
+ assertEquals("line 1:13: Invalid data type [SQL_INVALID] provided", ex.getMessage());
+ }
+
+ public void testConvertWithInvalidESDataType() {
+ ParsingException ex = expectThrows(ParsingException.class, () -> parser.createExpression("CONVERT(1, INVALID)"));
+ assertEquals("line 1:13: Invalid data type [INVALID] provided", ex.getMessage());
+ }
}
diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/type/DataTypeConversionTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/type/DataTypeConversionTests.java
index 1db470211f0..f773634fe72 100644
--- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/type/DataTypeConversionTests.java
+++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/type/DataTypeConversionTests.java
@@ -246,4 +246,10 @@ public class DataTypeConversionTests extends ESTestCase {
assertEquals(type, DataType.fromEsType(type.esType));
}
}
+
+ public void testConversionToUnsupported() {
+ Exception e = expectThrows(SqlIllegalArgumentException.class,
+ () -> DataTypeConversion.conversionFor(DataType.INTEGER, DataType.UNSUPPORTED));
+ assertEquals("cannot convert from [INTEGER] to [UNSUPPORTED]", e.getMessage());
+ }
}
diff --git a/x-pack/qa/sql/src/main/resources/docs.csv-spec b/x-pack/qa/sql/src/main/resources/docs.csv-spec
index d225c3d35da..b0c5936a702 100644
--- a/x-pack/qa/sql/src/main/resources/docs.csv-spec
+++ b/x-pack/qa/sql/src/main/resources/docs.csv-spec
@@ -1164,6 +1164,33 @@ SELECT YEAR(CAST('2018-05-19T11:23:45Z' AS TIMESTAMP)) AS year;
// end::conversionStringToDateCast
;
+///////////////////////////////
+//
+// Convert
+//
+///////////////////////////////
+
+conversionStringToIntConvertESDataType
+// tag::conversionStringToIntConvertESDataType
+SELECT CONVERT('123', INTEGER) AS int;
+
+ int
+---------------
+123
+// end::conversionStringToIntConvertESDataType
+;
+
+conversionStringToIntConvertODBCDataType
+// tag::conversionStringToIntConvertODBCDataType
+SELECT CONVERT('123', SQL_INTEGER) AS int;
+
+ int
+---------------
+123
+// end::conversionStringToIntConvertODBCDataType
+;
+
+
///////////////////////////////
//
// Math
From 4bda9bdab0bebcf4a85002c17e27d0713eccc84e Mon Sep 17 00:00:00 2001
From: lipsill <39668292+lipsill@users.noreply.github.com>
Date: Tue, 23 Oct 2018 11:36:42 +0200
Subject: [PATCH 06/24] TESTING.asciidoc fix examples using forbidden
annotation (#34515)
Clean up examples not to use forbidden test annotation `@Nightly`.
remove references to unused annotations
---
TESTING.asciidoc | 25 ++++---------------------
1 file changed, 4 insertions(+), 21 deletions(-)
diff --git a/TESTING.asciidoc b/TESTING.asciidoc
index d16d85b2ee1..9c8ab20a3a6 100644
--- a/TESTING.asciidoc
+++ b/TESTING.asciidoc
@@ -77,39 +77,24 @@ Run a single test case (variants)
./gradlew test "-Dtests.class=*.ClassName"
----------------------------------------------------------
-Run all tests in a package and sub-packages
+Run all tests in a package and its sub-packages
----------------------------------------------------
./gradlew test "-Dtests.class=org.elasticsearch.package.*"
----------------------------------------------------
-Run any test methods that contain 'esi' (like: ...r*esi*ze...).
+Run any test methods that contain 'esi' (like: ...r*esi*ze...)
-------------------------------
./gradlew test "-Dtests.method=*esi*"
-------------------------------
-You can also filter tests by certain annotations ie:
-
- * `@Nightly` - tests that only run in nightly builds (disabled by default)
- * `@Backwards` - backwards compatibility tests (disabled by default)
- * `@AwaitsFix` - tests that are waiting for a bugfix (disabled by default)
- * `@BadApple` - tests that are known to fail randomly (disabled by default)
-
-Those annotation names can be combined into a filter expression like:
+Run all tests that are waiting for a bugfix (disabled by default)
------------------------------------------------
-./gradlew test -Dtests.filter="@nightly and not @backwards"
+./gradlew test -Dtests.filter=@awaitsfix
------------------------------------------------
-to run all nightly test but not the ones that are backwards tests. `tests.filter` supports
-the boolean operators `and, or, not` and grouping ie:
-
-
----------------------------------------------------------------
-./gradlew test -Dtests.filter="@nightly and not(@badapple or @backwards)"
----------------------------------------------------------------
-
=== Seed and repetitions.
Run with a given seed (seed is a hex-encoded long).
@@ -160,8 +145,6 @@ Test groups can be enabled or disabled (true/false).
Default value provided below in [brackets].
------------------------------------------------------------------
-./gradlew test -Dtests.nightly=[false] - nightly test group (@Nightly)
-./gradlew test -Dtests.weekly=[false] - weekly tests (@Weekly)
./gradlew test -Dtests.awaitsfix=[false] - known issue (@AwaitsFix)
------------------------------------------------------------------
From 183c32d4c39948e037a7fb44dccf31ab0d60d3c3 Mon Sep 17 00:00:00 2001
From: Frederik Bosch
Date: Tue, 23 Oct 2018 12:25:04 +0200
Subject: [PATCH 07/24] [DOCS] Force Merge: clarify execution and storage
requirements (#33882)
---
docs/reference/indices/forcemerge.asciidoc | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/docs/reference/indices/forcemerge.asciidoc b/docs/reference/indices/forcemerge.asciidoc
index 57fe746d59b..a28d5eaa858 100644
--- a/docs/reference/indices/forcemerge.asciidoc
+++ b/docs/reference/indices/forcemerge.asciidoc
@@ -55,7 +55,11 @@ POST /kimchy/_forcemerge?only_expunge_deletes=false&max_num_segments=100&flush=t
=== Multi Index
The force merge API can be applied to more than one index with a single call, or
-even on `_all` the indices.
+even on `_all` the indices. Multi index operations are executed one shard at a
+time per node. Force merge makes the storage for the shard being merged
+temporarily increase, up to double its size in case `max_num_segments` is set
+to `1`, as all segments need to be rewritten into a new one.
+
[source,js]
--------------------------------------------------
From 83fd93b2fd654920f0ff5d3d80f3d48b40182c88 Mon Sep 17 00:00:00 2001
From: Alexander Reelsen
Date: Tue, 23 Oct 2018 13:26:02 +0200
Subject: [PATCH 08/24] Core: Move IndexNameExpressionResolver to java time
(#34507)
This switches from joda time to java time when resolving index names
using date math. This commit also removes two non registered settings
from the code, which could not be used anyway. An unused method was
removed as well.
Relates #27330
---
.../metadata/IndexNameExpressionResolver.java | 65 ++++++-------------
.../DateMathExpressionResolverTests.java | 34 +---------
2 files changed, 20 insertions(+), 79 deletions(-)
diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java
index d0824ea7d8f..9be5acc0561 100644
--- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java
+++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java
@@ -27,27 +27,27 @@ import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.collect.Tuple;
import org.elasticsearch.common.component.AbstractComponent;
-import org.elasticsearch.common.joda.FormatDateTimeFormatter;
import org.elasticsearch.common.regex.Regex;
import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.common.time.DateFormatter;
+import org.elasticsearch.common.time.DateFormatters;
import org.elasticsearch.common.time.DateMathParser;
-import org.elasticsearch.common.time.DateUtils;
+import org.elasticsearch.common.time.JavaDateMathParser;
import org.elasticsearch.common.util.set.Sets;
import org.elasticsearch.index.Index;
import org.elasticsearch.index.IndexNotFoundException;
import org.elasticsearch.indices.IndexClosedException;
import org.elasticsearch.indices.InvalidIndexNameException;
-import org.joda.time.DateTimeZone;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
-import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
@@ -62,7 +62,7 @@ public class IndexNameExpressionResolver extends AbstractComponent {
public IndexNameExpressionResolver(Settings settings) {
super(settings);
expressionResolvers = Arrays.asList(
- dateMathExpressionResolver = new DateMathExpressionResolver(settings),
+ dateMathExpressionResolver = new DateMathExpressionResolver(),
new WildcardExpressionResolver()
);
}
@@ -815,6 +815,7 @@ public class IndexNameExpressionResolver extends AbstractComponent {
static final class DateMathExpressionResolver implements ExpressionResolver {
+ private static final DateFormatter DEFAULT_DATE_FORMATTER = DateFormatters.forPattern("uuuu.MM.dd");
private static final String EXPRESSION_LEFT_BOUND = "<";
private static final String EXPRESSION_RIGHT_BOUND = ">";
private static final char LEFT_BOUND = '{';
@@ -822,17 +823,6 @@ public class IndexNameExpressionResolver extends AbstractComponent {
private static final char ESCAPE_CHAR = '\\';
private static final char TIME_ZONE_BOUND = '|';
- private final DateTimeZone defaultTimeZone;
- private final String defaultDateFormatterPattern;
- private final DateTimeFormatter defaultDateFormatter;
-
- DateMathExpressionResolver(Settings settings) {
- String defaultTimeZoneId = settings.get("date_math_expression_resolver.default_time_zone", "UTC");
- this.defaultTimeZone = DateTimeZone.forID(defaultTimeZoneId);
- defaultDateFormatterPattern = settings.get("date_math_expression_resolver.default_date_format", "YYYY.MM.dd");
- this.defaultDateFormatter = DateTimeFormat.forPattern(defaultDateFormatterPattern);
- }
-
@Override
public List resolve(final Context context, List expressions) {
List result = new ArrayList<>(expressions.size());
@@ -896,13 +886,12 @@ public class IndexNameExpressionResolver extends AbstractComponent {
int dateTimeFormatLeftBoundIndex = inPlaceHolderString.indexOf(LEFT_BOUND);
String mathExpression;
String dateFormatterPattern;
- DateTimeFormatter dateFormatter;
- final DateTimeZone timeZone;
+ DateFormatter dateFormatter;
+ final ZoneId timeZone;
if (dateTimeFormatLeftBoundIndex < 0) {
mathExpression = inPlaceHolderString;
- dateFormatterPattern = defaultDateFormatterPattern;
- dateFormatter = defaultDateFormatter;
- timeZone = defaultTimeZone;
+ dateFormatter = DEFAULT_DATE_FORMATTER;
+ timeZone = ZoneOffset.UTC;
} else {
if (inPlaceHolderString.lastIndexOf(RIGHT_BOUND) != inPlaceHolderString.length() - 1) {
throw new ElasticsearchParseException("invalid dynamic name expression [{}]. missing closing `}` for date math format", inPlaceHolderString);
@@ -915,20 +904,18 @@ public class IndexNameExpressionResolver extends AbstractComponent {
int formatPatternTimeZoneSeparatorIndex = dateFormatterPatternAndTimeZoneId.indexOf(TIME_ZONE_BOUND);
if (formatPatternTimeZoneSeparatorIndex != -1) {
dateFormatterPattern = dateFormatterPatternAndTimeZoneId.substring(0, formatPatternTimeZoneSeparatorIndex);
- timeZone = DateTimeZone.forID(dateFormatterPatternAndTimeZoneId.substring(formatPatternTimeZoneSeparatorIndex + 1));
+ timeZone = ZoneId.of(dateFormatterPatternAndTimeZoneId.substring(formatPatternTimeZoneSeparatorIndex + 1));
} else {
dateFormatterPattern = dateFormatterPatternAndTimeZoneId;
- timeZone = defaultTimeZone;
+ timeZone = ZoneOffset.UTC;
}
- dateFormatter = DateTimeFormat.forPattern(dateFormatterPattern);
+ dateFormatter = DateFormatters.forPattern(dateFormatterPattern);
}
- DateTimeFormatter parser = dateFormatter.withZone(timeZone);
- FormatDateTimeFormatter formatter = new FormatDateTimeFormatter(dateFormatterPattern, parser, Locale.ROOT);
- DateMathParser dateMathParser = formatter.toDateMathParser();
- long millis = dateMathParser.parse(mathExpression, context::getStartTime, false,
- DateUtils.dateTimeZoneToZoneId(timeZone));
+ DateFormatter formatter = dateFormatter.withZone(timeZone);
+ DateMathParser dateMathParser = new JavaDateMathParser(formatter);
+ long millis = dateMathParser.parse(mathExpression, context::getStartTime, false, timeZone);
- String time = formatter.printer().print(millis);
+ String time = formatter.format(Instant.ofEpochMilli(millis));
beforePlaceHolderSb.append(time);
inPlaceHolderSb = new StringBuilder();
inPlaceHolder = false;
@@ -968,18 +955,4 @@ public class IndexNameExpressionResolver extends AbstractComponent {
return beforePlaceHolderSb.toString();
}
}
-
- /**
- * Returns true
iff the given expression resolves to the given index name otherwise false
- */
- public final boolean matchesIndex(String indexName, String expression, ClusterState state) {
- final String[] concreteIndices = concreteIndexNames(state, IndicesOptions.lenientExpandOpen(), expression);
- for (String index : concreteIndices) {
- if (Regex.simpleMatch(index, indexName)) {
- return true;
- }
- }
- return indexName.equals(expression);
- }
-
}
diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/DateMathExpressionResolverTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/DateMathExpressionResolverTests.java
index 4f235e52636..b0660929648 100644
--- a/server/src/test/java/org/elasticsearch/cluster/metadata/DateMathExpressionResolverTests.java
+++ b/server/src/test/java/org/elasticsearch/cluster/metadata/DateMathExpressionResolverTests.java
@@ -25,7 +25,6 @@ import org.elasticsearch.cluster.ClusterName;
import org.elasticsearch.cluster.ClusterState;
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.Context;
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.DateMathExpressionResolver;
-import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.test.ESTestCase;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
@@ -42,7 +41,7 @@ import static org.joda.time.DateTimeZone.UTC;
public class DateMathExpressionResolverTests extends ESTestCase {
- private final DateMathExpressionResolver expressionResolver = new DateMathExpressionResolver(Settings.EMPTY);
+ private final DateMathExpressionResolver expressionResolver = new DateMathExpressionResolver();
private final Context context = new Context(
ClusterState.builder(new ClusterName("_name")).build(), IndicesOptions.strictExpand()
);
@@ -118,37 +117,6 @@ public class DateMathExpressionResolverTests extends ESTestCase {
assertThat(result.get(3), equalTo(".logstash-" + DateTimeFormat.forPattern("YYYY.MM").print(new DateTime(context.getStartTime(), UTC).withDayOfMonth(1))));
}
- public void testExpression_CustomTimeZoneInSetting() throws Exception {
- DateTimeZone timeZone;
- int hoursOffset;
- int minutesOffset = 0;
- if (randomBoolean()) {
- hoursOffset = randomIntBetween(-12, 14);
- timeZone = DateTimeZone.forOffsetHours(hoursOffset);
- } else {
- hoursOffset = randomIntBetween(-11, 13);
- minutesOffset = randomIntBetween(0, 59);
- timeZone = DateTimeZone.forOffsetHoursMinutes(hoursOffset, minutesOffset);
- }
- DateTime now;
- if (hoursOffset >= 0) {
- // rounding to next day 00:00
- now = DateTime.now(UTC).plusHours(hoursOffset).plusMinutes(minutesOffset).withHourOfDay(0).withMinuteOfHour(0).withSecondOfMinute(0);
- } else {
- // rounding to today 00:00
- now = DateTime.now(UTC).withHourOfDay(0).withMinuteOfHour(0).withSecondOfMinute(0);
- }
- Settings settings = Settings.builder()
- .put("date_math_expression_resolver.default_time_zone", timeZone.getID())
- .build();
- DateMathExpressionResolver expressionResolver = new DateMathExpressionResolver(settings);
- Context context = new Context(this.context.getState(), this.context.getOptions(), now.getMillis());
- List results = expressionResolver.resolve(context, Arrays.asList("<.marvel-{now/d{YYYY.MM.dd}}>"));
- assertThat(results.size(), equalTo(1));
- logger.info("timezone: [{}], now [{}], name: [{}]", timeZone, now, results.get(0));
- assertThat(results.get(0), equalTo(".marvel-" + DateTimeFormat.forPattern("YYYY.MM.dd").print(now.withZone(timeZone))));
- }
-
public void testExpression_CustomTimeZoneInIndexName() throws Exception {
DateTimeZone timeZone;
int hoursOffset;
From 8e155b8430d0d1d216aabb10c680f7fbd1318871 Mon Sep 17 00:00:00 2001
From: Armin Braun
Date: Tue, 23 Oct 2018 13:43:26 +0200
Subject: [PATCH 09/24] INGEST: Rename Pipeline Processor Param. (#34733)
* `name` is more readable/ergnomic than having `pipeline` twice
---
.../test/ingest/210_pipeline_processor.yml | 6 +++---
.../rest-api-spec/test/ingest/90_simulate.yml | 10 +++++-----
.../elasticsearch/ingest/PipelineProcessor.java | 2 +-
.../ingest/PipelineProcessorTests.java | 16 ++++++++--------
.../ingest/TrackingResultProcessorTests.java | 8 ++++----
5 files changed, 21 insertions(+), 21 deletions(-)
diff --git a/modules/ingest-common/src/test/resources/rest-api-spec/test/ingest/210_pipeline_processor.yml b/modules/ingest-common/src/test/resources/rest-api-spec/test/ingest/210_pipeline_processor.yml
index c7c5df1e06f..4efaaeb4091 100644
--- a/modules/ingest-common/src/test/resources/rest-api-spec/test/ingest/210_pipeline_processor.yml
+++ b/modules/ingest-common/src/test/resources/rest-api-spec/test/ingest/210_pipeline_processor.yml
@@ -44,7 +44,7 @@ teardown:
"processors" : [
{
"pipeline" : {
- "pipeline": "inner"
+ "name": "inner"
}
}
]
@@ -78,7 +78,7 @@ teardown:
"processors" : [
{
"pipeline" : {
- "pipeline": "inner"
+ "name": "inner"
}
}
]
@@ -94,7 +94,7 @@ teardown:
"processors" : [
{
"pipeline" : {
- "pipeline": "outer"
+ "name": "outer"
}
}
]
diff --git a/modules/ingest-common/src/test/resources/rest-api-spec/test/ingest/90_simulate.yml b/modules/ingest-common/src/test/resources/rest-api-spec/test/ingest/90_simulate.yml
index 46c4fb0a69e..bdcfdc7f6b1 100644
--- a/modules/ingest-common/src/test/resources/rest-api-spec/test/ingest/90_simulate.yml
+++ b/modules/ingest-common/src/test/resources/rest-api-spec/test/ingest/90_simulate.yml
@@ -617,7 +617,7 @@ teardown:
"processors" : [
{
"pipeline" : {
- "pipeline": "inner"
+ "name": "inner"
}
}
]
@@ -633,7 +633,7 @@ teardown:
"processors" : [
{
"pipeline" : {
- "pipeline": "outer"
+ "name": "outer"
}
}
]
@@ -650,7 +650,7 @@ teardown:
"processors" : [
{
"pipeline" : {
- "pipeline": "outer"
+ "name": "outer"
}
}
]
@@ -686,7 +686,7 @@ teardown:
},
{
"pipeline": {
- "pipeline": "pipeline2"
+ "name": "pipeline2"
}
}
]
@@ -724,7 +724,7 @@ teardown:
},
{
"pipeline": {
- "pipeline": "pipeline1"
+ "name": "pipeline1"
}
}
]
diff --git a/server/src/main/java/org/elasticsearch/ingest/PipelineProcessor.java b/server/src/main/java/org/elasticsearch/ingest/PipelineProcessor.java
index 918ff6b8aef..624925cc4d7 100644
--- a/server/src/main/java/org/elasticsearch/ingest/PipelineProcessor.java
+++ b/server/src/main/java/org/elasticsearch/ingest/PipelineProcessor.java
@@ -65,7 +65,7 @@ public class PipelineProcessor extends AbstractProcessor {
public PipelineProcessor create(Map registry, String processorTag,
Map config) throws Exception {
String pipeline =
- ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "pipeline");
+ ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "name");
return new PipelineProcessor(processorTag, pipeline, ingestService);
}
}
diff --git a/server/src/test/java/org/elasticsearch/ingest/PipelineProcessorTests.java b/server/src/test/java/org/elasticsearch/ingest/PipelineProcessorTests.java
index 018ded346d4..7c2a219daf0 100644
--- a/server/src/test/java/org/elasticsearch/ingest/PipelineProcessorTests.java
+++ b/server/src/test/java/org/elasticsearch/ingest/PipelineProcessorTests.java
@@ -62,7 +62,7 @@ public class PipelineProcessorTests extends ESTestCase {
when(ingestService.getPipeline(pipelineId)).thenReturn(pipeline);
PipelineProcessor.Factory factory = new PipelineProcessor.Factory(ingestService);
Map config = new HashMap<>();
- config.put("pipeline", pipelineId);
+ config.put("name", pipelineId);
factory.create(Collections.emptyMap(), null, config).execute(testIngestDocument);
assertEquals(testIngestDocument, invoked.get());
}
@@ -72,7 +72,7 @@ public class PipelineProcessorTests extends ESTestCase {
IngestDocument testIngestDocument = RandomDocumentPicks.randomIngestDocument(random(), new HashMap<>());
PipelineProcessor.Factory factory = new PipelineProcessor.Factory(ingestService);
Map config = new HashMap<>();
- config.put("pipeline", "missingPipelineId");
+ config.put("name", "missingPipelineId");
IllegalStateException e = expectThrows(
IllegalStateException.class,
() -> factory.create(Collections.emptyMap(), null, config).execute(testIngestDocument)
@@ -88,21 +88,21 @@ public class PipelineProcessorTests extends ESTestCase {
IngestService ingestService = mock(IngestService.class);
IngestDocument testIngestDocument = RandomDocumentPicks.randomIngestDocument(random(), new HashMap<>());
Map outerConfig = new HashMap<>();
- outerConfig.put("pipeline", innerPipelineId);
+ outerConfig.put("name", innerPipelineId);
PipelineProcessor.Factory factory = new PipelineProcessor.Factory(ingestService);
Pipeline outer = new Pipeline(
outerPipelineId, null, null,
new CompoundProcessor(factory.create(Collections.emptyMap(), null, outerConfig))
);
Map innerConfig = new HashMap<>();
- innerConfig.put("pipeline", outerPipelineId);
+ innerConfig.put("name", outerPipelineId);
Pipeline inner = new Pipeline(
innerPipelineId, null, null,
new CompoundProcessor(factory.create(Collections.emptyMap(), null, innerConfig))
);
when(ingestService.getPipeline(outerPipelineId)).thenReturn(outer);
when(ingestService.getPipeline(innerPipelineId)).thenReturn(inner);
- outerConfig.put("pipeline", innerPipelineId);
+ outerConfig.put("name", innerPipelineId);
ElasticsearchException e = expectThrows(
ElasticsearchException.class,
() -> factory.create(Collections.emptyMap(), null, outerConfig).execute(testIngestDocument)
@@ -117,7 +117,7 @@ public class PipelineProcessorTests extends ESTestCase {
IngestService ingestService = mock(IngestService.class);
IngestDocument testIngestDocument = RandomDocumentPicks.randomIngestDocument(random(), new HashMap<>());
Map outerConfig = new HashMap<>();
- outerConfig.put("pipeline", innerPipelineId);
+ outerConfig.put("name", innerPipelineId);
PipelineProcessor.Factory factory = new PipelineProcessor.Factory(ingestService);
Pipeline inner = new Pipeline(
innerPipelineId, null, null, new CompoundProcessor()
@@ -136,11 +136,11 @@ public class PipelineProcessorTests extends ESTestCase {
PipelineProcessor.Factory factory = new PipelineProcessor.Factory(ingestService);
Map pipeline1ProcessorConfig = new HashMap<>();
- pipeline1ProcessorConfig.put("pipeline", pipeline2Id);
+ pipeline1ProcessorConfig.put("name", pipeline2Id);
PipelineProcessor pipeline1Processor = factory.create(Collections.emptyMap(), null, pipeline1ProcessorConfig);
Map pipeline2ProcessorConfig = new HashMap<>();
- pipeline2ProcessorConfig.put("pipeline", pipeline3Id);
+ pipeline2ProcessorConfig.put("name", pipeline3Id);
PipelineProcessor pipeline2Processor = factory.create(Collections.emptyMap(), null, pipeline2ProcessorConfig);
Clock clock = mock(Clock.class);
diff --git a/server/src/test/java/org/elasticsearch/ingest/TrackingResultProcessorTests.java b/server/src/test/java/org/elasticsearch/ingest/TrackingResultProcessorTests.java
index 7a7f9b77372..fbb46fc8787 100644
--- a/server/src/test/java/org/elasticsearch/ingest/TrackingResultProcessorTests.java
+++ b/server/src/test/java/org/elasticsearch/ingest/TrackingResultProcessorTests.java
@@ -158,7 +158,7 @@ public class TrackingResultProcessorTests extends ESTestCase {
String pipelineId = "pipeline1";
IngestService ingestService = mock(IngestService.class);
Map pipelineConfig = new HashMap<>();
- pipelineConfig.put("pipeline", pipelineId);
+ pipelineConfig.put("name", pipelineId);
PipelineProcessor.Factory factory = new PipelineProcessor.Factory(ingestService);
String key1 = randomAlphaOfLength(10);
@@ -204,7 +204,7 @@ public class TrackingResultProcessorTests extends ESTestCase {
String pipelineId = "pipeline1";
IngestService ingestService = mock(IngestService.class);
Map pipelineConfig = new HashMap<>();
- pipelineConfig.put("pipeline", pipelineId);
+ pipelineConfig.put("name", pipelineId);
PipelineProcessor.Factory factory = new PipelineProcessor.Factory(ingestService);
String key1 = randomAlphaOfLength(10);
@@ -256,7 +256,7 @@ public class TrackingResultProcessorTests extends ESTestCase {
String pipelineId = "pipeline1";
IngestService ingestService = mock(IngestService.class);
Map pipelineConfig = new HashMap<>();
- pipelineConfig.put("pipeline", pipelineId);
+ pipelineConfig.put("name", pipelineId);
PipelineProcessor.Factory factory = new PipelineProcessor.Factory(ingestService);
PipelineProcessor pipelineProcessor = factory.create(Collections.emptyMap(), null, pipelineConfig);
@@ -277,7 +277,7 @@ public class TrackingResultProcessorTests extends ESTestCase {
String pipelineId = "pipeline1";
IngestService ingestService = mock(IngestService.class);
Map pipelineConfig = new HashMap<>();
- pipelineConfig.put("pipeline", pipelineId);
+ pipelineConfig.put("name", pipelineId);
PipelineProcessor.Factory factory = new PipelineProcessor.Factory(ingestService);
String key1 = randomAlphaOfLength(10);
From 123f784e3249919c23141c6a943d14a9da586337 Mon Sep 17 00:00:00 2001
From: Igor Motov
Date: Tue, 23 Oct 2018 07:55:41 -0400
Subject: [PATCH 10/24] Tests: Add checks to GeoDistanceQueryBuilderTests
(#34273)
Adds checks for parsed geo distance query. It is a bit hack-ish since it
compares with query's toString() output, but it is better than no
checks. The parsed query itself has default visibility, so we cannot
access it here unless we move the test to org.apache.lucene.document
package.
Fixes #34043
---
.../query/GeoDistanceQueryBuilderTests.java | 32 +++++++++++--------
1 file changed, 18 insertions(+), 14 deletions(-)
diff --git a/server/src/test/java/org/elasticsearch/index/query/GeoDistanceQueryBuilderTests.java b/server/src/test/java/org/elasticsearch/index/query/GeoDistanceQueryBuilderTests.java
index 3a011251224..1312486ff69 100644
--- a/server/src/test/java/org/elasticsearch/index/query/GeoDistanceQueryBuilderTests.java
+++ b/server/src/test/java/org/elasticsearch/index/query/GeoDistanceQueryBuilderTests.java
@@ -156,7 +156,7 @@ public class GeoDistanceQueryBuilderTests extends AbstractQueryTestCase
Date: Tue, 23 Oct 2018 14:28:23 +0200
Subject: [PATCH 11/24] SQL: Implement IN(value1, value2, ...) expression.
(#34581)
Implement the functionality to translate the
`field IN (value1, value2,...)` expressions to proper Lucene queries
or painless script or local processors depending on the use case.
The `IN` expression can be used in SELECT, WHERE and HAVING clauses.
Closes: #32955
---
.../sql/functions/operators.asciidoc | 9 +-
.../xpack/sql/type/DataType.java | 12 +++
.../xpack/sql/analysis/analyzer/Verifier.java | 24 ++++-
.../xpack/sql/expression/Expressions.java | 9 ++
.../sql/expression/gen/pipeline/Pipe.java | 5 +-
.../xpack/sql/expression/predicate/In.java | 95 ++++++++++++++++---
.../operator/comparison/Comparisons.java | 14 ++-
.../predicate/operator/comparison/InPipe.java | 90 ++++++++++++++++++
.../operator/comparison/InProcessor.java | 65 +++++++++++++
.../xpack/sql/optimizer/Optimizer.java | 2 +-
.../xpack/sql/planner/QueryFolder.java | 4 +
.../xpack/sql/planner/QueryTranslator.java | 69 ++++++++++++--
.../xpack/sql/querydsl/query/TermsQuery.java | 59 ++++++++++++
.../analyzer/VerifierErrorMessagesTests.java | 40 ++++++++
.../predicate/InProcessorTests.java | 53 +++++++++++
.../xpack/sql/optimizer/OptimizerTests.java | 92 +++++++++++-------
.../sql/planner/QueryTranslatorTests.java | 73 +++++++++++---
x-pack/qa/sql/src/main/resources/agg.sql-spec | 7 +-
.../qa/sql/src/main/resources/filter.sql-spec | 18 ++++
.../qa/sql/src/main/resources/select.csv-spec | 67 +++++++++++++
20 files changed, 727 insertions(+), 80 deletions(-)
create mode 100644 x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/InPipe.java
create mode 100644 x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/operator/comparison/InProcessor.java
create mode 100644 x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/querydsl/query/TermsQuery.java
create mode 100644 x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/predicate/InProcessorTests.java
create mode 100644 x-pack/qa/sql/src/main/resources/select.csv-spec
diff --git a/docs/reference/sql/functions/operators.asciidoc b/docs/reference/sql/functions/operators.asciidoc
index 9c90d12320e..aae9d47ec7e 100644
--- a/docs/reference/sql/functions/operators.asciidoc
+++ b/docs/reference/sql/functions/operators.asciidoc
@@ -3,7 +3,7 @@
[[sql-operators]]
=== Comparison Operators
-Boolean operator for comparing one or two expressions.
+Boolean operator for comparing against one or multiple expressions.
* Equality (`=`)
@@ -40,6 +40,13 @@ include-tagged::{sql-specs}/filter.sql-spec[whereBetween]
include-tagged::{sql-specs}/filter.sql-spec[whereIsNotNullAndIsNull]
--------------------------------------------------
+* `IN (, , ...)`
+
+["source","sql",subs="attributes,callouts,macros"]
+--------------------------------------------------
+include-tagged::{sql-specs}/filter.sql-spec[whereWithInAndMultipleValues]
+--------------------------------------------------
+
[[sql-operators-logical]]
=== Logical Operators
diff --git a/x-pack/plugin/sql/sql-proto/src/main/java/org/elasticsearch/xpack/sql/type/DataType.java b/x-pack/plugin/sql/sql-proto/src/main/java/org/elasticsearch/xpack/sql/type/DataType.java
index 4087a81a424..1c08c6e1c9f 100644
--- a/x-pack/plugin/sql/sql-proto/src/main/java/org/elasticsearch/xpack/sql/type/DataType.java
+++ b/x-pack/plugin/sql/sql-proto/src/main/java/org/elasticsearch/xpack/sql/type/DataType.java
@@ -225,4 +225,16 @@ public enum DataType {
public static DataType fromEsType(String esType) {
return DataType.valueOf(esType.toUpperCase(Locale.ROOT));
}
+
+ public boolean isCompatibleWith(DataType other) {
+ if (this == other) {
+ return true;
+ } else if (isString() && other.isString()) {
+ return true;
+ } else if (isNumeric() && other.isNumeric()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
}
diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/analysis/analyzer/Verifier.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/analysis/analyzer/Verifier.java
index 4915a25a55b..e5ab3ce082b 100644
--- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/analysis/analyzer/Verifier.java
+++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/analysis/analyzer/Verifier.java
@@ -18,6 +18,7 @@ import org.elasticsearch.xpack.sql.expression.function.FunctionAttribute;
import org.elasticsearch.xpack.sql.expression.function.Functions;
import org.elasticsearch.xpack.sql.expression.function.Score;
import org.elasticsearch.xpack.sql.expression.function.scalar.ScalarFunction;
+import org.elasticsearch.xpack.sql.expression.predicate.In;
import org.elasticsearch.xpack.sql.plan.logical.Aggregate;
import org.elasticsearch.xpack.sql.plan.logical.Distinct;
import org.elasticsearch.xpack.sql.plan.logical.Filter;
@@ -40,7 +41,9 @@ import java.util.function.Consumer;
import static java.lang.String.format;
-abstract class Verifier {
+final class Verifier {
+
+ private Verifier() {}
static class Failure {
private final Node> source;
@@ -188,6 +191,8 @@ abstract class Verifier {
Set localFailures = new LinkedHashSet<>();
+ validateInExpression(p, localFailures);
+
if (!groupingFailures.contains(p)) {
checkGroupBy(p, localFailures, resolvedFunctions, groupingFailures);
}
@@ -488,4 +493,19 @@ abstract class Verifier {
fail(nested.get(0), "HAVING isn't (yet) compatible with nested fields " + new AttributeSet(nested).names()));
}
}
-}
\ No newline at end of file
+
+ private static void validateInExpression(LogicalPlan p, Set localFailures) {
+ p.forEachExpressions(e ->
+ e.forEachUp((In in) -> {
+ DataType dt = in.value().dataType();
+ for (Expression value : in.list()) {
+ if (!in.value().dataType().isCompatibleWith(value.dataType())) {
+ localFailures.add(fail(value, "expected data type [%s], value provided is of type [%s]",
+ dt, value.dataType()));
+ return;
+ }
+ }
+ },
+ In.class));
+ }
+}
diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Expressions.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Expressions.java
index c95e08f087d..e9a37240be0 100644
--- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Expressions.java
+++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Expressions.java
@@ -67,6 +67,15 @@ public final class Expressions {
return true;
}
+ public static boolean foldable(List extends Expression> exps) {
+ for (Expression exp : exps) {
+ if (!exp.foldable()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
public static AttributeSet references(List extends Expression> exps) {
if (exps.isEmpty()) {
return AttributeSet.EMPTY;
diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/Pipe.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/Pipe.java
index 4d1604ff535..5c96d2c9244 100644
--- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/Pipe.java
+++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/gen/pipeline/Pipe.java
@@ -5,6 +5,7 @@
*/
package org.elasticsearch.xpack.sql.expression.gen.pipeline;
+import org.elasticsearch.xpack.sql.capabilities.Resolvable;
import org.elasticsearch.xpack.sql.execution.search.FieldExtraction;
import org.elasticsearch.xpack.sql.expression.Attribute;
import org.elasticsearch.xpack.sql.expression.Expression;
@@ -24,7 +25,7 @@ import java.util.List;
* Is an {@code Add} operator with left {@code ABS} over an aggregate (MAX), and
* right being a {@code CAST} function.
*/
-public abstract class Pipe extends Node implements FieldExtraction {
+public abstract class Pipe extends Node implements FieldExtraction, Resolvable {
private final Expression expression;
@@ -37,8 +38,6 @@ public abstract class Pipe extends Node implements FieldExtraction {
return expression;
}
- public abstract boolean resolved();
-
public abstract Processor asProcessor();
/**
diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/In.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/In.java
index fb04f6d438a..a820833d1a0 100644
--- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/In.java
+++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/In.java
@@ -5,43 +5,55 @@
*/
package org.elasticsearch.xpack.sql.expression.predicate;
-import org.elasticsearch.xpack.sql.SqlIllegalArgumentException;
import org.elasticsearch.xpack.sql.expression.Attribute;
import org.elasticsearch.xpack.sql.expression.Expression;
+import org.elasticsearch.xpack.sql.expression.Expressions;
import org.elasticsearch.xpack.sql.expression.NamedExpression;
+import org.elasticsearch.xpack.sql.expression.function.scalar.ScalarFunctionAttribute;
+import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe;
+import org.elasticsearch.xpack.sql.expression.gen.script.Params;
+import org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder;
import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate;
+import org.elasticsearch.xpack.sql.expression.gen.script.ScriptWeaver;
+import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.Comparisons;
+import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.InPipe;
import org.elasticsearch.xpack.sql.tree.Location;
import org.elasticsearch.xpack.sql.tree.NodeInfo;
import org.elasticsearch.xpack.sql.type.DataType;
import org.elasticsearch.xpack.sql.util.CollectionUtils;
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Locale;
import java.util.Objects;
+import java.util.StringJoiner;
+import java.util.stream.Collectors;
-public class In extends NamedExpression {
+import static java.lang.String.format;
+import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder;
+
+public class In extends NamedExpression implements ScriptWeaver {
private final Expression value;
private final List list;
- private final boolean nullable, foldable;
+ private Attribute lazyAttribute;
public In(Location location, Expression value, List list) {
super(location, null, CollectionUtils.combine(list, value), null);
this.value = value;
- this.list = list;
-
- this.nullable = children().stream().anyMatch(Expression::nullable);
- this.foldable = children().stream().allMatch(Expression::foldable);
+ this.list = list.stream().distinct().collect(Collectors.toList());
}
@Override
protected NodeInfo info() {
- return NodeInfo.create(this, In::new, value(), list());
+ return NodeInfo.create(this, In::new, value, list);
}
@Override
public Expression replaceChildren(List newChildren) {
- if (newChildren.size() < 1) {
- throw new IllegalArgumentException("expected one or more children but received [" + newChildren.size() + "]");
+ if (newChildren.size() < 2) {
+ throw new IllegalArgumentException("expected at least [2] children but received [" + newChildren.size() + "]");
}
return new In(location(), newChildren.get(newChildren.size() - 1), newChildren.subList(0, newChildren.size() - 1));
}
@@ -61,22 +73,75 @@ public class In extends NamedExpression {
@Override
public boolean nullable() {
- return nullable;
+ return Expressions.nullable(children());
}
@Override
public boolean foldable() {
- return foldable;
+ return Expressions.foldable(children());
+ }
+
+ @Override
+ public Object fold() {
+ Object foldedLeftValue = value.fold();
+
+ for (Expression rightValue : list) {
+ Boolean compResult = Comparisons.eq(foldedLeftValue, rightValue.fold());
+ if (compResult != null && compResult) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String name() {
+ StringJoiner sj = new StringJoiner(", ", " IN(", ")");
+ list.forEach(e -> sj.add(Expressions.name(e)));
+ return Expressions.name(value) + sj.toString();
}
@Override
public Attribute toAttribute() {
- throw new SqlIllegalArgumentException("not implemented yet");
+ if (lazyAttribute == null) {
+ lazyAttribute = new ScalarFunctionAttribute(location(), name(), dataType(), null,
+ false, id(), false, "IN", asScript(), null, asPipe());
+ }
+ return lazyAttribute;
}
@Override
public ScriptTemplate asScript() {
- throw new SqlIllegalArgumentException("not implemented yet");
+ StringJoiner sj = new StringJoiner(" || ");
+ ScriptTemplate leftScript = asScript(value);
+ List rightParams = new ArrayList<>();
+ String scriptPrefix = leftScript + "==";
+ LinkedHashSet