diff --git a/CHANGELOG.md b/CHANGELOG.md index 609b98b91..e2e28fae0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ All notable changes to this project will be documented in this file. - hive: Restore the `get_table` and `get_table_objects_by_name` Thrift methods that HIVE-26537 removed in Hive 4.0.1, for `4.2.0` ([#1636]). - hadoop, spark: Add SBOMs for the pre-built JavaScript that is vendored into the source tree for the HDFS and Spark web UIs ([#1620]). - stats-exporter: Add `0.31.0` ([#1664]). +- hive: Add `4.2.1` ([#1637]). ### Changed @@ -58,6 +59,7 @@ All notable changes to this project will be documented in this file. ### Removed +- hive: Remove `4.0.1` ([#1637]). - omid: remove 1.1.2 ([#1593]). - ci: Remove SLSA build provenance generation for published image indexes ([#1596]). @@ -72,6 +74,7 @@ All notable changes to this project will be documented in this file. [#1630]: https://github.com/stackabletech/docker-images/pull/1630 [#1635]: https://github.com/stackabletech/docker-images/pull/1635 [#1636]: https://github.com/stackabletech/docker-images/pull/1636 +[#1637]: https://github.com/stackabletech/docker-images/pull/1637 [#1638]: https://github.com/stackabletech/docker-images/pull/1638 [#1641]: https://github.com/stackabletech/docker-images/pull/1641 [#1664]: https://github.com/stackabletech/docker-images/pull/1664 diff --git a/hive/boil-config.toml b/hive/boil-config.toml index a2293e353..7ed21db86 100644 --- a/hive/boil-config.toml +++ b/hive/boil-config.toml @@ -26,25 +26,24 @@ java-devel = "8" jmx-exporter-version = "1.3.0" -[versions."4.0.1".local-images] -# Hive 4.0 must be built with Java 8 (according to GitHub README) but seems to run on Java 11 -java-base = "11" -java-devel = "8" -"hadoop/hadoop" = "3.3.6" +[versions."4.2.0".local-images] +# Hive 4.2 requires Java 21 (according to GitHub README) +java-base = "21" +java-devel = "21" +"hadoop/hadoop" = "3.4.3" # hive-metastore-opa-authorizer from: https://github.com/boschglobal/hive-metastore-opa-authorizer -"hive/hive-metastore-opa-authorizer" = "v1.0.0-hive-4.0.1-hadoop-3.3.6" +"hive/hive-metastore-opa-authorizer" = "v1.0.0-hive-4.2.0-hadoop-3.4.3" -[versions."4.0.1".build-arguments] +[versions."4.2.0".build-arguments] jmx-exporter-version = "1.3.0" - -[versions."4.2.0".local-images] +[versions."4.2.1".local-images] # Hive 4.2 requires Java 21 (according to GitHub README) java-base = "21" java-devel = "21" "hadoop/hadoop" = "3.4.3" # hive-metastore-opa-authorizer from: https://github.com/boschglobal/hive-metastore-opa-authorizer -"hive/hive-metastore-opa-authorizer" = "v1.0.0-hive-4.2.0-hadoop-3.4.3" +"hive/hive-metastore-opa-authorizer" = "v1.0.0-hive-4.2.1-hadoop-3.4.3" -[versions."4.2.0".build-arguments] +[versions."4.2.1".build-arguments] jmx-exporter-version = "1.3.0" diff --git a/hive/hive-metastore-opa-authorizer/boil-config.toml b/hive/hive-metastore-opa-authorizer/boil-config.toml index 2808be73d..ac6de15fa 100644 --- a/hive/hive-metastore-opa-authorizer/boil-config.toml +++ b/hive/hive-metastore-opa-authorizer/boil-config.toml @@ -16,15 +16,6 @@ authorizer-version = "v1.0.0" hive-version = "4.0.0" delete-caches = "true" -[versions."v1.0.0-hive-4.0.1-hadoop-3.3.6".local-images] -"java-devel" = "11" -"hadoop/hadoop" = "3.3.6" - -[versions."v1.0.0-hive-4.0.1-hadoop-3.3.6".build-arguments] -authorizer-version = "v1.0.0" -hive-version = "4.0.1" -delete-caches = "true" - [versions."v1.0.0-hive-4.1.0-hadoop-3.4.3".local-images] "java-devel" = "17" "hadoop/hadoop" = "3.4.3" @@ -42,3 +33,12 @@ delete-caches = "true" authorizer-version = "v1.0.0" hive-version = "4.2.0" delete-caches = "true" + +[versions."v1.0.0-hive-4.2.1-hadoop-3.4.3".local-images] +"java-devel" = "21" +"hadoop/hadoop" = "3.4.3" + +[versions."v1.0.0-hive-4.2.1-hadoop-3.4.3".build-arguments] +authorizer-version = "v1.0.0" +hive-version = "4.2.1" +delete-caches = "true" diff --git a/hive/stackable/patches/4.0.1/0003-Add-CycloneDX-plugin.patch b/hive/stackable/patches/4.0.1/0003-Add-CycloneDX-plugin.patch deleted file mode 100644 index 1e4d28867..000000000 --- a/hive/stackable/patches/4.0.1/0003-Add-CycloneDX-plugin.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 45bac943ef6f6af5b357f1ed05182b011466fde3 Mon Sep 17 00:00:00 2001 -From: Lukas Voetmand -Date: Fri, 6 Sep 2024 17:53:52 +0200 -Subject: Add CycloneDX plugin - ---- - standalone-metastore/pom.xml | 18 ++++++++++++++++++ - 1 file changed, 18 insertions(+) - -diff --git a/standalone-metastore/pom.xml b/standalone-metastore/pom.xml -index 0f5de8ec3c..edbac9ae11 100644 ---- a/standalone-metastore/pom.xml -+++ b/standalone-metastore/pom.xml -@@ -42,6 +42,7 @@ - false - ${settings.localRepository} - 3.1.0 -+ 2.8.0 - ${basedir}/${standalone.metastore.path.to.root}/checkstyle - - ${project.basedir}/src/test/resources -@@ -595,6 +596,23 @@ - - - -+ -+ org.cyclonedx -+ cyclonedx-maven-plugin -+ ${maven.cyclonedx.plugin.version} -+ -+ application -+ 1.5 -+ -+ -+ -+ package -+ -+ makeBom -+ -+ -+ -+ - - - diff --git a/hive/stackable/patches/4.0.1/0004-Fix-CVE-2024-36114.patch b/hive/stackable/patches/4.0.1/0004-Fix-CVE-2024-36114.patch deleted file mode 100644 index 1eafef56c..000000000 --- a/hive/stackable/patches/4.0.1/0004-Fix-CVE-2024-36114.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 2b88bb3431c66a1173ba061f624a94073b447a08 Mon Sep 17 00:00:00 2001 -From: Malte Sander -Date: Tue, 12 Nov 2024 11:49:57 +0100 -Subject: Fix CVE-2024-36114 - -see https://github.com/stackabletech/vulnerabilities/issues/834 - -Aircompressor is a library with ports of the Snappy, LZO, LZ4, and -Zstandard compression algorithms to Java. All decompressor -implementations of Aircompressor (LZ4, LZO, Snappy, Zstandard) can crash -the JVM for certain input, and in some cases also leak the content of -other memory of the Java process (which could contain sensitive -information). When decompressing certain data, the decompressors try to -access memory outside the bounds of the given byte arrays or byte -buffers. Because Aircompressor uses the JDK class sun.misc.Unsafe to -speed up memory access, no additional bounds checks are performed and -this has similar security consequences as out-of-bounds access in C or -C++, namely it can lead to non-deterministic behavior or crash the JVM. -Users should update to Aircompressor 0.27 or newer where these issues -have been fixed. When decompressing data from untrusted users, this can -be exploited for a denial-of-service attack by crashing the JVM, or to -leak other sensitive information from the Java process. There are no -known workarounds for this issue. ---- - standalone-metastore/pom.xml | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/standalone-metastore/pom.xml b/standalone-metastore/pom.xml -index edbac9ae11..599ad33ed0 100644 ---- a/standalone-metastore/pom.xml -+++ b/standalone-metastore/pom.xml -@@ -123,6 +123,12 @@ - - - -+ -+ -+ io.airlift -+ aircompressor -+ 0.27 -+ - - org.apache.orc - orc-core diff --git a/hive/stackable/patches/4.0.1/0005-Fix-CVE-2024-1597.patch b/hive/stackable/patches/4.0.1/0005-Fix-CVE-2024-1597.patch deleted file mode 100644 index 09a201b46..000000000 --- a/hive/stackable/patches/4.0.1/0005-Fix-CVE-2024-1597.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 134b9e22475b3ae59eabbc0bf5c188912dc2393b Mon Sep 17 00:00:00 2001 -From: Nick Larsen -Date: Thu, 15 May 2025 14:14:28 +0200 -Subject: Fix CVE-2024-1597 - -See https://github.com/stackabletech/vulnerabilities/issues/681 - -pgjdbc, the PostgreSQL JDBC Driver, allows attacker to inject SQL if using -PreferQueryMode=SIMPLE. Note this is not the default. In the default mode there -is no vulnerability. A placeholder for a numeric value must be immediately -preceded by a minus. There must be a second placeholder for a string value after -the first placeholder; both must be on the same line. By constructing a matching -string payload, the attacker can inject SQL to alter the query,bypassing the -protections that parameterized queries bring against SQL Injection attacks. -Versions before 42.7.2, 42.6.1, 42.5.5, 42.4.4, 42.3.9, and 42.2.28 are -affected. ---- - pom.xml | 2 +- - standalone-metastore/pom.xml | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/pom.xml b/pom.xml -index 1898adeebe..89cf93ed37 100644 ---- a/pom.xml -+++ b/pom.xml -@@ -179,7 +179,7 @@ - 2.5.0 - 6.2.1.jre8 - 8.0.31 -- 42.5.1 -+ 42.5.6 - 21.3.0.0 - 2.3 - 1.8.5 -diff --git a/standalone-metastore/pom.xml b/standalone-metastore/pom.xml -index 599ad33ed0..17dfe063e8 100644 ---- a/standalone-metastore/pom.xml -+++ b/standalone-metastore/pom.xml -@@ -73,7 +73,7 @@ - 2.5.0 - 6.2.1.jre8 - 8.0.31 -- 42.5.1 -+ 42.5.6 - 21.3.0.0 - 0.1.2 - diff --git a/hive/stackable/patches/4.0.1/0001-Include-Postgres-driver.patch b/hive/stackable/patches/4.2.1/0001-Include-Postgres-driver.patch similarity index 78% rename from hive/stackable/patches/4.0.1/0001-Include-Postgres-driver.patch rename to hive/stackable/patches/4.2.1/0001-Include-Postgres-driver.patch index c1c70fe7a..57b0d46c8 100644 --- a/hive/stackable/patches/4.0.1/0001-Include-Postgres-driver.patch +++ b/hive/stackable/patches/4.2.1/0001-Include-Postgres-driver.patch @@ -1,6 +1,6 @@ -From 44d83fa02779ac3135f76ce711f11c108a432ea3 Mon Sep 17 00:00:00 2001 -From: Sebastian Bernauer -Date: Tue, 3 Sep 2024 11:13:24 +0200 +From 9bfbe159795b690bdf5eb19e83bd227ae9345082 Mon Sep 17 00:00:00 2001 +From: Malte Sander +Date: Tue, 25 Nov 2025 11:29:03 +0100 Subject: Include Postgres driver --- @@ -9,10 +9,10 @@ Subject: Include Postgres driver 2 files changed, 2 deletions(-) diff --git a/standalone-metastore/metastore-server/pom.xml b/standalone-metastore/metastore-server/pom.xml -index 3d14d6b2e3..fdc813c5b9 100644 +index fd68c6cb65..b07aa0228d 100644 --- a/standalone-metastore/metastore-server/pom.xml +++ b/standalone-metastore/metastore-server/pom.xml -@@ -334,7 +334,6 @@ +@@ -338,7 +338,6 @@ org.postgresql postgresql @@ -21,10 +21,10 @@ index 3d14d6b2e3..fdc813c5b9 100644 org.eclipse.jetty diff --git a/standalone-metastore/pom.xml b/standalone-metastore/pom.xml -index 744b88c6db..c0bb928611 100644 +index 69de496b40..4f75c22dec 100644 --- a/standalone-metastore/pom.xml +++ b/standalone-metastore/pom.xml -@@ -399,7 +399,6 @@ +@@ -435,7 +435,6 @@ org.postgresql postgresql ${postgres.version} diff --git a/hive/stackable/patches/4.0.1/0002-Include-logging-dependencies.patch b/hive/stackable/patches/4.2.1/0002-Include-logging-dependencies.patch similarity index 70% rename from hive/stackable/patches/4.0.1/0002-Include-logging-dependencies.patch rename to hive/stackable/patches/4.2.1/0002-Include-logging-dependencies.patch index b63b54fb3..683bad344 100644 --- a/hive/stackable/patches/4.0.1/0002-Include-logging-dependencies.patch +++ b/hive/stackable/patches/4.2.1/0002-Include-logging-dependencies.patch @@ -1,18 +1,17 @@ -From ed96173868c88142fded0291f901d84d6c63ed51 Mon Sep 17 00:00:00 2001 -From: Lars Francke -Date: Tue, 13 Aug 2024 13:38:12 +0200 +From 09fa507880275d6e9828e4c3ed44cb7a67d2b9ed Mon Sep 17 00:00:00 2001 +From: Malte Sander +Date: Tue, 25 Nov 2025 11:30:24 +0100 Subject: Include logging dependencies -This adds dependencies required for use of the XmlLayout for logging --- standalone-metastore/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/standalone-metastore/pom.xml b/standalone-metastore/pom.xml -index c0bb928611..0f5de8ec3c 100644 +index 4f75c22dec..43c458d49e 100644 --- a/standalone-metastore/pom.xml +++ b/standalone-metastore/pom.xml -@@ -495,6 +495,11 @@ +@@ -582,6 +582,11 @@ com.fasterxml.jackson.core jackson-databind diff --git a/hive/stackable/patches/4.2.1/0003-Fix-CVE-2024-36114.patch b/hive/stackable/patches/4.2.1/0003-Fix-CVE-2024-36114.patch new file mode 100644 index 000000000..7ac03ef42 --- /dev/null +++ b/hive/stackable/patches/4.2.1/0003-Fix-CVE-2024-36114.patch @@ -0,0 +1,26 @@ +From 96f3a4364b02f751e54328d88ad0edf3d639bba3 Mon Sep 17 00:00:00 2001 +From: Malte Sander +Date: Tue, 25 Nov 2025 11:31:34 +0100 +Subject: Fix CVE-2024-36114 + +--- + standalone-metastore/pom.xml | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/standalone-metastore/pom.xml b/standalone-metastore/pom.xml +index 43c458d49e..6517b3cc22 100644 +--- a/standalone-metastore/pom.xml ++++ b/standalone-metastore/pom.xml +@@ -157,6 +157,12 @@ + ${netty.version} + linux-x86_64 + ++ ++ ++ io.airlift ++ aircompressor ++ 0.27 ++ + + org.apache.orc + orc-core diff --git a/hive/stackable/patches/4.2.1/0004-Add-httpcomponents.core5-to-hive-standalone-metastor.patch b/hive/stackable/patches/4.2.1/0004-Add-httpcomponents.core5-to-hive-standalone-metastor.patch new file mode 100644 index 000000000..e8bdcb3a7 --- /dev/null +++ b/hive/stackable/patches/4.2.1/0004-Add-httpcomponents.core5-to-hive-standalone-metastor.patch @@ -0,0 +1,40 @@ +From 780e2aaeae8d721e78f46a4312ce1dc38c436206 Mon Sep 17 00:00:00 2001 +From: Malte Sander +Date: Tue, 25 Nov 2025 14:44:35 +0100 +Subject: Add httpcomponents.core5 to hive-standalone-metastore + +Required for the REST Catalog. +--- + standalone-metastore/metastore-rest-catalog/pom.xml | 5 +++++ + standalone-metastore/pom.xml | 2 ++ + 2 files changed, 7 insertions(+) + +diff --git a/standalone-metastore/metastore-rest-catalog/pom.xml b/standalone-metastore/metastore-rest-catalog/pom.xml +index 5fb601fe1a..682259d334 100644 +--- a/standalone-metastore/metastore-rest-catalog/pom.xml ++++ b/standalone-metastore/metastore-rest-catalog/pom.xml +@@ -26,6 +26,11 @@ + 1.9.1 + + ++ ++ org.apache.httpcomponents.core5 ++ httpcore5 ++ ${httpcomponents5.core.version} ++ + + org.apache.hive + hive-standalone-metastore-server +diff --git a/standalone-metastore/pom.xml b/standalone-metastore/pom.xml +index 6517b3cc22..45d804e172 100644 +--- a/standalone-metastore/pom.xml ++++ b/standalone-metastore/pom.xml +@@ -117,6 +117,8 @@ + 1.7.30 + 4.4.13 + 4.5.13 ++ ++ 5.3.1 + 4.5.8 + 11.28 + 9.4.57.v20241219 diff --git a/hive/stackable/patches/4.2.1/0005-Resolve-every-in-reactor-dependency-against-the-modu.patch b/hive/stackable/patches/4.2.1/0005-Resolve-every-in-reactor-dependency-against-the-modu.patch new file mode 100644 index 000000000..14b7e8de4 --- /dev/null +++ b/hive/stackable/patches/4.2.1/0005-Resolve-every-in-reactor-dependency-against-the-modu.patch @@ -0,0 +1,148 @@ +From a96d083fc68a4599208f674a35f31383e0a886ab Mon Sep 17 00:00:00 2001 +From: Lars Francke +Date: Mon, 14 Sep 2026 11:18:42 +0200 +Subject: Resolve every in-reactor dependency against the modules built + alongside it + +standalone-metastore refers to several modules built in the same reactor through the literal +hive.version property rather than ${project.version}. Upstream the two values coincide, so +nothing shows. Our image build runs "mvn versions:set" to stamp the Stackable release version +onto every module, which breaks the coincidence: the reactor modules are renamed, hive.version +is not, and Maven then downloads the published artifact from Maven Central instead of using +the one built beside it. + +The immediate effect is that metastore-server compiled against the stock metastore-client and +metastore-common, silently discarding any patch of ours to that API surface. That went +unnoticed while our Hive patches only touched poms; the following patch is the first to change +that surface, and without this one it fails to compile. + +The wider effect is what the image contains. Through the packaging module this is why our Hive +image has been shipping fifteen upstream jars - hive-exec, hive-metastore, hive-serde, the +shims and so on - downloaded from Maven Central rather than built here. We rebuild Hive in +order to control what we ship, so the artifacts we assemble should be the ones we built. + +Upstream fixed one instance of this, the metastore-server to metastore-client reference, for +Hive 4.3.0: https://issues.apache.org/jira/browse/HIVE-29827. This patch goes further on +purpose. + +Note for other Hive versions: this is correct as long as the image is built from the Hive root, +where every referenced module is in the reactor. Our Dockerfile does that from 4.0.0 onwards. +The 3.1.3 build instead uses "--projects standalone-metastore", where the main Hive artifacts +genuinely are external, so this patch must not be carried back to it unchanged. +--- + standalone-metastore/metastore-rest-catalog/pom.xml | 10 +++++----- + standalone-metastore/metastore-server/pom.xml | 2 +- + .../metastore-tools/metastore-benchmarks/pom.xml | 2 +- + standalone-metastore/metastore-tools/pom.xml | 2 +- + standalone-metastore/packaging/pom.xml | 6 +++--- + 5 files changed, 11 insertions(+), 11 deletions(-) + +diff --git a/standalone-metastore/metastore-rest-catalog/pom.xml b/standalone-metastore/metastore-rest-catalog/pom.xml +index 682259d334..d863231977 100644 +--- a/standalone-metastore/metastore-rest-catalog/pom.xml ++++ b/standalone-metastore/metastore-rest-catalog/pom.xml +@@ -34,31 +34,31 @@ + + org.apache.hive + hive-standalone-metastore-server +- ${hive.version} ++ ${project.version} + provided + + + org.apache.hive + hive-standalone-metastore-common +- ${hive.version} ++ ${project.version} + + + org.apache.hive + hive-iceberg-catalog +- ${hive.version} ++ ${project.version} + + + + org.apache.hive + hive-standalone-metastore-common +- ${hive.version} ++ ${project.version} + tests + test + + + org.apache.hive + hive-standalone-metastore-server +- ${hive.version} ++ ${project.version} + tests + test + +diff --git a/standalone-metastore/metastore-server/pom.xml b/standalone-metastore/metastore-server/pom.xml +index b07aa0228d..91d938db40 100644 +--- a/standalone-metastore/metastore-server/pom.xml ++++ b/standalone-metastore/metastore-server/pom.xml +@@ -28,7 +28,7 @@ + + org.apache.hive + hive-standalone-metastore-client +- ${hive.version} ++ ${project.version} + + + org.apache.httpcomponents +diff --git a/standalone-metastore/metastore-tools/metastore-benchmarks/pom.xml b/standalone-metastore/metastore-tools/metastore-benchmarks/pom.xml +index 1a2d781ff1..6c9e1a9cf0 100644 +--- a/standalone-metastore/metastore-tools/metastore-benchmarks/pom.xml ++++ b/standalone-metastore/metastore-tools/metastore-benchmarks/pom.xml +@@ -46,7 +46,7 @@ + + org.apache.hive.hcatalog + hive-hcatalog-server-extensions +- ${hive.version} ++ ${project.version} + + + org.apache.zookeeper +diff --git a/standalone-metastore/metastore-tools/pom.xml b/standalone-metastore/metastore-tools/pom.xml +index 82612a5057..f1b4c35af6 100644 +--- a/standalone-metastore/metastore-tools/pom.xml ++++ b/standalone-metastore/metastore-tools/pom.xml +@@ -39,7 +39,7 @@ + + org.apache.hive.hcatalog + hive-hcatalog-server-extensions +- ${hive.version} ++ ${project.version} + + + org.apache.zookeeper +diff --git a/standalone-metastore/packaging/pom.xml b/standalone-metastore/packaging/pom.xml +index 1f4ad53899..a0de88e1a3 100644 +--- a/standalone-metastore/packaging/pom.xml ++++ b/standalone-metastore/packaging/pom.xml +@@ -176,7 +176,7 @@ + + org.apache.hive + hive-metastore +- ${hive.version} ++ ${project.version} + + + org.apache.hive +@@ -192,13 +192,13 @@ + + org.apache.hive + hive-exec +- ${hive.version} ++ ${project.version} + core + + + org.apache.hive + hive-iceberg-handler +- ${hive.version} ++ ${project.version} + + + org.apache.hive diff --git a/hive/stackable/patches/4.2.1/0006-Restore-the-deprecated-get_table-and-get_table_objec.patch b/hive/stackable/patches/4.2.1/0006-Restore-the-deprecated-get_table-and-get_table_objec.patch new file mode 100644 index 000000000..6e4645fc6 --- /dev/null +++ b/hive/stackable/patches/4.2.1/0006-Restore-the-deprecated-get_table-and-get_table_objec.patch @@ -0,0 +1,2475 @@ +From c4c57ad84e0f3ad78ae6394b20ca2d3ec51063e9 Mon Sep 17 00:00:00 2001 +From: Lars Francke +Date: Mon, 14 Sep 2026 11:23:35 +0200 +Subject: Restore the deprecated get_table and get_table_objects_by_name Thrift + methods + +HIVE-26537 removed five methods from the HMS Thrift interface in Hive 4.0.1. Two of them, +get_table and get_table_objects_by_name, are still called by any metastore client built +against Hive 2.3, which is what Spark bundles: 2.3.9 in Spark 3.5 and 2.3.10 in Spark 4.0 +through 4.2. Iceberg's HiveCatalog reaches the metastore through IMetaStoreClient and so +uses whichever client Spark supplies, which makes an Iceberg job against a Hive 4.0.1 or +newer metastore fail with + + TApplicationException: Invalid method name: 'get_table' + +The removal was a code cleanup rather than a fix. The Jira is titled "Deprecate older APIs +in the HMS" and carries no incompatible-change flag, and the author's stated reasoning on +the pull request was "in the next release, we would like to remove all the deprecated APIs +in the thrift class. Even though it breaks the incompatibility, moving forward we'll have a +clean code base." + +Nothing upstream has moved since: Hive considers the removal correct, Spark has bundled the +2.3 client for three major lines, and apache/iceberg#12878 is still open. PyIceberg solved +the same problem in its own client (apache/iceberg-python#3924) by calling the request-based +methods and keeping the old ones behind a "talking to Hive 2" flag, which is what the Java +client should eventually do too. Until then this restores the two methods server-side. + +Both handlers are the Hive 4.0.0 implementations unchanged. They add no logic: each +builds the request object and delegates to the private internal method that the surviving +_req variant already calls, so there is one implementation per operation and the +authorisation pre-event fires on the shared path either way. The old entry point cannot +express client capabilities or a write-id snapshot, so it returns strictly less than the +request-based one and refuses tables whose capability check it cannot satisfy. + +The declarations are appended at the end of the service block rather than restored where +they used to be. Thrift numbers its generated local variables in declaration order, so +inserting them earlier renumbers thousands of unrelated lines in the checked-in generated +sources. Appending keeps the generated diff purely additive, and dispatch is by name so the +position has no effect on the wire. + +The generated sources were regenerated with the thrift version this release pins, and the +InterfaceAudience and InterfaceStability annotations were re-applied following the +convention in the rest of the file. Regenerate with +.scripts/regenerate_hive_thrift_compat_patch.sh rather than editing them by hand. +--- + .../metastore/api/ThriftHiveMetastore.java | 2300 +++++++++++++++++ + .../src/main/thrift/hive_metastore.thrift | 13 + + .../hadoop/hive/metastore/HMSHandler.java | 18 + + 3 files changed, 2331 insertions(+) + +diff --git a/standalone-metastore/metastore-common/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/ThriftHiveMetastore.java b/standalone-metastore/metastore-common/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/ThriftHiveMetastore.java +index f2746b3582..4f3235f204 100644 +--- a/standalone-metastore/metastore-common/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/ThriftHiveMetastore.java ++++ b/standalone-metastore/metastore-common/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api/ThriftHiveMetastore.java +@@ -583,6 +583,10 @@ package org.apache.hadoop.hive.metastore.api; + + public ReplayedTxnsForPolicyResult get_replayed_txns_for_policy(java.lang.String policyName) throws MetaException, org.apache.thrift.TException; + ++ public Table get_table(java.lang.String dbname, java.lang.String tbl_name) throws MetaException, NoSuchObjectException, org.apache.thrift.TException; ++ ++ public java.util.List get_table_objects_by_name(java.lang.String dbname, java.util.List tbl_names) throws org.apache.thrift.TException; ++ + } + + @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public interface AsyncIface extends com.facebook.fb303.FacebookService .AsyncIface { +@@ -1155,6 +1159,10 @@ package org.apache.hadoop.hive.metastore.api; + + public void get_replayed_txns_for_policy(java.lang.String policyName, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException; + ++ public void get_table(java.lang.String dbname, java.lang.String tbl_name, org.apache.thrift.async.AsyncMethodCallback
resultHandler) throws org.apache.thrift.TException; ++ ++ public void get_table_objects_by_name(java.lang.String dbname, java.util.List tbl_names, org.apache.thrift.async.AsyncMethodCallback> resultHandler) throws org.apache.thrift.TException; ++ + } + + @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class Client extends com.facebook.fb303.FacebookService.Client implements Iface { +@@ -9202,6 +9210,60 @@ package org.apache.hadoop.hive.metastore.api; + throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "get_replayed_txns_for_policy failed: unknown result"); + } + ++ public Table get_table(java.lang.String dbname, java.lang.String tbl_name) throws MetaException, NoSuchObjectException, org.apache.thrift.TException ++ { ++ send_get_table(dbname, tbl_name); ++ return recv_get_table(); ++ } ++ ++ public void send_get_table(java.lang.String dbname, java.lang.String tbl_name) throws org.apache.thrift.TException ++ { ++ get_table_args args = new get_table_args(); ++ args.setDbname(dbname); ++ args.setTbl_name(tbl_name); ++ sendBase("get_table", args); ++ } ++ ++ public Table recv_get_table() throws MetaException, NoSuchObjectException, org.apache.thrift.TException ++ { ++ get_table_result result = new get_table_result(); ++ receiveBase(result, "get_table"); ++ if (result.isSetSuccess()) { ++ return result.success; ++ } ++ if (result.o1 != null) { ++ throw result.o1; ++ } ++ if (result.o2 != null) { ++ throw result.o2; ++ } ++ throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "get_table failed: unknown result"); ++ } ++ ++ public java.util.List
get_table_objects_by_name(java.lang.String dbname, java.util.List tbl_names) throws org.apache.thrift.TException ++ { ++ send_get_table_objects_by_name(dbname, tbl_names); ++ return recv_get_table_objects_by_name(); ++ } ++ ++ public void send_get_table_objects_by_name(java.lang.String dbname, java.util.List tbl_names) throws org.apache.thrift.TException ++ { ++ get_table_objects_by_name_args args = new get_table_objects_by_name_args(); ++ args.setDbname(dbname); ++ args.setTbl_names(tbl_names); ++ sendBase("get_table_objects_by_name", args); ++ } ++ ++ public java.util.List
recv_get_table_objects_by_name() throws org.apache.thrift.TException ++ { ++ get_table_objects_by_name_result result = new get_table_objects_by_name_result(); ++ receiveBase(result, "get_table_objects_by_name"); ++ if (result.isSetSuccess()) { ++ return result.success; ++ } ++ throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "get_table_objects_by_name failed: unknown result"); ++ } ++ + } + @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class AsyncClient extends com.facebook.fb303.FacebookService.AsyncClient implements AsyncIface { + @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class Factory implements org.apache.thrift.async.TAsyncClientFactory { +@@ -18809,6 +18871,76 @@ package org.apache.hadoop.hive.metastore.api; + } + } + ++ public void get_table(java.lang.String dbname, java.lang.String tbl_name, org.apache.thrift.async.AsyncMethodCallback
resultHandler) throws org.apache.thrift.TException { ++ checkReady(); ++ get_table_call method_call = new get_table_call(dbname, tbl_name, resultHandler, this, ___protocolFactory, ___transport); ++ this.___currentMethod = method_call; ++ ___manager.call(method_call); ++ } ++ ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table_call extends org.apache.thrift.async.TAsyncMethodCall
{ ++ private java.lang.String dbname; ++ private java.lang.String tbl_name; ++ public get_table_call(java.lang.String dbname, java.lang.String tbl_name, org.apache.thrift.async.AsyncMethodCallback
resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException { ++ super(client, protocolFactory, transport, resultHandler, false); ++ this.dbname = dbname; ++ this.tbl_name = tbl_name; ++ } ++ ++ public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException { ++ prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("get_table", org.apache.thrift.protocol.TMessageType.CALL, 0)); ++ get_table_args args = new get_table_args(); ++ args.setDbname(dbname); ++ args.setTbl_name(tbl_name); ++ args.write(prot); ++ prot.writeMessageEnd(); ++ } ++ ++ public Table getResult() throws MetaException, NoSuchObjectException, org.apache.thrift.TException { ++ if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) { ++ throw new java.lang.IllegalStateException("Method call not finished!"); ++ } ++ org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array()); ++ org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport); ++ return (new Client(prot)).recv_get_table(); ++ } ++ } ++ ++ public void get_table_objects_by_name(java.lang.String dbname, java.util.List tbl_names, org.apache.thrift.async.AsyncMethodCallback> resultHandler) throws org.apache.thrift.TException { ++ checkReady(); ++ get_table_objects_by_name_call method_call = new get_table_objects_by_name_call(dbname, tbl_names, resultHandler, this, ___protocolFactory, ___transport); ++ this.___currentMethod = method_call; ++ ___manager.call(method_call); ++ } ++ ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table_objects_by_name_call extends org.apache.thrift.async.TAsyncMethodCall> { ++ private java.lang.String dbname; ++ private java.util.List tbl_names; ++ public get_table_objects_by_name_call(java.lang.String dbname, java.util.List tbl_names, org.apache.thrift.async.AsyncMethodCallback> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException { ++ super(client, protocolFactory, transport, resultHandler, false); ++ this.dbname = dbname; ++ this.tbl_names = tbl_names; ++ } ++ ++ public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException { ++ prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("get_table_objects_by_name", org.apache.thrift.protocol.TMessageType.CALL, 0)); ++ get_table_objects_by_name_args args = new get_table_objects_by_name_args(); ++ args.setDbname(dbname); ++ args.setTbl_names(tbl_names); ++ args.write(prot); ++ prot.writeMessageEnd(); ++ } ++ ++ public java.util.List
getResult() throws org.apache.thrift.TException { ++ if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) { ++ throw new java.lang.IllegalStateException("Method call not finished!"); ++ } ++ org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array()); ++ org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport); ++ return (new Client(prot)).recv_get_table_objects_by_name(); ++ } ++ } ++ + } + + @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class Processor extends com.facebook.fb303.FacebookService.Processor implements org.apache.thrift.TProcessor { +@@ -19106,6 +19238,8 @@ package org.apache.hadoop.hive.metastore.api; + processMap.put("drop_package", new drop_package()); + processMap.put("get_all_write_event_info", new get_all_write_event_info()); + processMap.put("get_replayed_txns_for_policy", new get_replayed_txns_for_policy()); ++ processMap.put("get_table", new get_table()); ++ processMap.put("get_table_objects_by_name", new get_table_objects_by_name()); + return processMap; + } + +@@ -27783,6 +27917,62 @@ package org.apache.hadoop.hive.metastore.api; + } + } + ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table extends org.apache.thrift.ProcessFunction { ++ public get_table() { ++ super("get_table"); ++ } ++ ++ public get_table_args getEmptyArgsInstance() { ++ return new get_table_args(); ++ } ++ ++ protected boolean isOneway() { ++ return false; ++ } ++ ++ @Override ++ protected boolean rethrowUnhandledExceptions() { ++ return false; ++ } ++ ++ public get_table_result getResult(I iface, get_table_args args) throws org.apache.thrift.TException { ++ get_table_result result = new get_table_result(); ++ try { ++ result.success = iface.get_table(args.dbname, args.tbl_name); ++ } catch (MetaException o1) { ++ result.o1 = o1; ++ } catch (NoSuchObjectException o2) { ++ result.o2 = o2; ++ } ++ return result; ++ } ++ } ++ ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table_objects_by_name extends org.apache.thrift.ProcessFunction { ++ public get_table_objects_by_name() { ++ super("get_table_objects_by_name"); ++ } ++ ++ public get_table_objects_by_name_args getEmptyArgsInstance() { ++ return new get_table_objects_by_name_args(); ++ } ++ ++ protected boolean isOneway() { ++ return false; ++ } ++ ++ @Override ++ protected boolean rethrowUnhandledExceptions() { ++ return false; ++ } ++ ++ public get_table_objects_by_name_result getResult(I iface, get_table_objects_by_name_args args) throws org.apache.thrift.TException { ++ get_table_objects_by_name_result result = new get_table_objects_by_name_result(); ++ result.success = iface.get_table_objects_by_name(args.dbname, args.tbl_names); ++ return result; ++ } ++ } ++ + } + + @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class AsyncProcessor extends com.facebook.fb303.FacebookService.AsyncProcessor { +@@ -28080,6 +28270,8 @@ package org.apache.hadoop.hive.metastore.api; + processMap.put("drop_package", new drop_package()); + processMap.put("get_all_write_event_info", new get_all_write_event_info()); + processMap.put("get_replayed_txns_for_policy", new get_replayed_txns_for_policy()); ++ processMap.put("get_table", new get_table()); ++ processMap.put("get_table_objects_by_name", new get_table_objects_by_name()); + return processMap; + } + +@@ -47446,6 +47638,136 @@ package org.apache.hadoop.hive.metastore.api; + } + } + ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table extends org.apache.thrift.AsyncProcessFunction { ++ public get_table() { ++ super("get_table"); ++ } ++ ++ public get_table_args getEmptyArgsInstance() { ++ return new get_table_args(); ++ } ++ ++ public org.apache.thrift.async.AsyncMethodCallback
getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) { ++ final org.apache.thrift.AsyncProcessFunction fcall = this; ++ return new org.apache.thrift.async.AsyncMethodCallback
() { ++ public void onComplete(Table o) { ++ get_table_result result = new get_table_result(); ++ result.success = o; ++ try { ++ fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid); ++ } catch (org.apache.thrift.transport.TTransportException e) { ++ _LOGGER.error("TTransportException writing to internal frame buffer", e); ++ fb.close(); ++ } catch (java.lang.Exception e) { ++ _LOGGER.error("Exception writing to internal frame buffer", e); ++ onError(e); ++ } ++ } ++ public void onError(java.lang.Exception e) { ++ byte msgType = org.apache.thrift.protocol.TMessageType.REPLY; ++ org.apache.thrift.TSerializable msg; ++ get_table_result result = new get_table_result(); ++ if (e instanceof MetaException) { ++ result.o1 = (MetaException) e; ++ result.setO1IsSet(true); ++ msg = result; ++ } else if (e instanceof NoSuchObjectException) { ++ result.o2 = (NoSuchObjectException) e; ++ result.setO2IsSet(true); ++ msg = result; ++ } else if (e instanceof org.apache.thrift.transport.TTransportException) { ++ _LOGGER.error("TTransportException inside handler", e); ++ fb.close(); ++ return; ++ } else if (e instanceof org.apache.thrift.TApplicationException) { ++ _LOGGER.error("TApplicationException inside handler", e); ++ msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION; ++ msg = (org.apache.thrift.TApplicationException)e; ++ } else { ++ _LOGGER.error("Exception inside handler", e); ++ msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION; ++ msg = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage()); ++ } ++ try { ++ fcall.sendResponse(fb,msg,msgType,seqid); ++ } catch (java.lang.Exception ex) { ++ _LOGGER.error("Exception writing to internal frame buffer", ex); ++ fb.close(); ++ } ++ } ++ }; ++ } ++ ++ protected boolean isOneway() { ++ return false; ++ } ++ ++ public void start(I iface, get_table_args args, org.apache.thrift.async.AsyncMethodCallback
resultHandler) throws org.apache.thrift.TException { ++ iface.get_table(args.dbname, args.tbl_name,resultHandler); ++ } ++ } ++ ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table_objects_by_name extends org.apache.thrift.AsyncProcessFunction> { ++ public get_table_objects_by_name() { ++ super("get_table_objects_by_name"); ++ } ++ ++ public get_table_objects_by_name_args getEmptyArgsInstance() { ++ return new get_table_objects_by_name_args(); ++ } ++ ++ public org.apache.thrift.async.AsyncMethodCallback> getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) { ++ final org.apache.thrift.AsyncProcessFunction fcall = this; ++ return new org.apache.thrift.async.AsyncMethodCallback>() { ++ public void onComplete(java.util.List
o) { ++ get_table_objects_by_name_result result = new get_table_objects_by_name_result(); ++ result.success = o; ++ try { ++ fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid); ++ } catch (org.apache.thrift.transport.TTransportException e) { ++ _LOGGER.error("TTransportException writing to internal frame buffer", e); ++ fb.close(); ++ } catch (java.lang.Exception e) { ++ _LOGGER.error("Exception writing to internal frame buffer", e); ++ onError(e); ++ } ++ } ++ public void onError(java.lang.Exception e) { ++ byte msgType = org.apache.thrift.protocol.TMessageType.REPLY; ++ org.apache.thrift.TSerializable msg; ++ get_table_objects_by_name_result result = new get_table_objects_by_name_result(); ++ if (e instanceof org.apache.thrift.transport.TTransportException) { ++ _LOGGER.error("TTransportException inside handler", e); ++ fb.close(); ++ return; ++ } else if (e instanceof org.apache.thrift.TApplicationException) { ++ _LOGGER.error("TApplicationException inside handler", e); ++ msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION; ++ msg = (org.apache.thrift.TApplicationException)e; ++ } else { ++ _LOGGER.error("Exception inside handler", e); ++ msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION; ++ msg = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage()); ++ } ++ try { ++ fcall.sendResponse(fb,msg,msgType,seqid); ++ } catch (java.lang.Exception ex) { ++ _LOGGER.error("Exception writing to internal frame buffer", ex); ++ fb.close(); ++ } ++ } ++ }; ++ } ++ ++ protected boolean isOneway() { ++ return false; ++ } ++ ++ public void start(I iface, get_table_objects_by_name_args args, org.apache.thrift.async.AsyncMethodCallback> resultHandler) throws org.apache.thrift.TException { ++ iface.get_table_objects_by_name(args.dbname, args.tbl_names,resultHandler); ++ } ++ } ++ + } + + @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class abort_Compactions_args implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { +@@ -322884,4 +323206,1982 @@ package org.apache.hadoop.hive.metastore.api; + } + } + ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table_args implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { ++ private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("get_table_args"); ++ ++ private static final org.apache.thrift.protocol.TField DBNAME_FIELD_DESC = new org.apache.thrift.protocol.TField("dbname", org.apache.thrift.protocol.TType.STRING, (short)1); ++ private static final org.apache.thrift.protocol.TField TBL_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("tbl_name", org.apache.thrift.protocol.TType.STRING, (short)2); ++ ++ private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new get_table_argsStandardSchemeFactory(); ++ private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new get_table_argsTupleSchemeFactory(); ++ ++ private @org.apache.thrift.annotation.Nullable java.lang.String dbname; // required ++ private @org.apache.thrift.annotation.Nullable java.lang.String tbl_name; // required ++ ++ /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ ++ public enum _Fields implements org.apache.thrift.TFieldIdEnum { ++ DBNAME((short)1, "dbname"), ++ TBL_NAME((short)2, "tbl_name"); ++ ++ private static final java.util.Map byName = new java.util.HashMap(); ++ ++ static { ++ for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) { ++ byName.put(field.getFieldName(), field); ++ } ++ } ++ ++ /** ++ * Find the _Fields constant that matches fieldId, or null if its not found. ++ */ ++ @org.apache.thrift.annotation.Nullable ++ public static _Fields findByThriftId(int fieldId) { ++ switch(fieldId) { ++ case 1: // DBNAME ++ return DBNAME; ++ case 2: // TBL_NAME ++ return TBL_NAME; ++ default: ++ return null; ++ } ++ } ++ ++ /** ++ * Find the _Fields constant that matches fieldId, throwing an exception ++ * if it is not found. ++ */ ++ public static _Fields findByThriftIdOrThrow(int fieldId) { ++ _Fields fields = findByThriftId(fieldId); ++ if (fields == null) throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!"); ++ return fields; ++ } ++ ++ /** ++ * Find the _Fields constant that matches name, or null if its not found. ++ */ ++ @org.apache.thrift.annotation.Nullable ++ public static _Fields findByName(java.lang.String name) { ++ return byName.get(name); ++ } ++ ++ private final short _thriftId; ++ private final java.lang.String _fieldName; ++ ++ _Fields(short thriftId, java.lang.String fieldName) { ++ _thriftId = thriftId; ++ _fieldName = fieldName; ++ } ++ ++ public short getThriftFieldId() { ++ return _thriftId; ++ } ++ ++ public java.lang.String getFieldName() { ++ return _fieldName; ++ } ++ } ++ ++ // isset id assignments ++ public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; ++ static { ++ java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); ++ tmpMap.put(_Fields.DBNAME, new org.apache.thrift.meta_data.FieldMetaData("dbname", org.apache.thrift.TFieldRequirementType.DEFAULT, ++ new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))); ++ tmpMap.put(_Fields.TBL_NAME, new org.apache.thrift.meta_data.FieldMetaData("tbl_name", org.apache.thrift.TFieldRequirementType.DEFAULT, ++ new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))); ++ metaDataMap = java.util.Collections.unmodifiableMap(tmpMap); ++ org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(get_table_args.class, metaDataMap); ++ } ++ ++ public get_table_args() { ++ } ++ ++ public get_table_args( ++ java.lang.String dbname, ++ java.lang.String tbl_name) ++ { ++ this(); ++ this.dbname = dbname; ++ this.tbl_name = tbl_name; ++ } ++ ++ /** ++ * Performs a deep copy on other. ++ */ ++ public get_table_args(get_table_args other) { ++ if (other.isSetDbname()) { ++ this.dbname = other.dbname; ++ } ++ if (other.isSetTbl_name()) { ++ this.tbl_name = other.tbl_name; ++ } ++ } ++ ++ public get_table_args deepCopy() { ++ return new get_table_args(this); ++ } ++ ++ @Override ++ public void clear() { ++ this.dbname = null; ++ this.tbl_name = null; ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.lang.String getDbname() { ++ return this.dbname; ++ } ++ ++ public void setDbname(@org.apache.thrift.annotation.Nullable java.lang.String dbname) { ++ this.dbname = dbname; ++ } ++ ++ public void unsetDbname() { ++ this.dbname = null; ++ } ++ ++ /** Returns true if field dbname is set (has been assigned a value) and false otherwise */ ++ public boolean isSetDbname() { ++ return this.dbname != null; ++ } ++ ++ public void setDbnameIsSet(boolean value) { ++ if (!value) { ++ this.dbname = null; ++ } ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.lang.String getTbl_name() { ++ return this.tbl_name; ++ } ++ ++ public void setTbl_name(@org.apache.thrift.annotation.Nullable java.lang.String tbl_name) { ++ this.tbl_name = tbl_name; ++ } ++ ++ public void unsetTbl_name() { ++ this.tbl_name = null; ++ } ++ ++ /** Returns true if field tbl_name is set (has been assigned a value) and false otherwise */ ++ public boolean isSetTbl_name() { ++ return this.tbl_name != null; ++ } ++ ++ public void setTbl_nameIsSet(boolean value) { ++ if (!value) { ++ this.tbl_name = null; ++ } ++ } ++ ++ public void setFieldValue(_Fields field, @org.apache.thrift.annotation.Nullable java.lang.Object value) { ++ switch (field) { ++ case DBNAME: ++ if (value == null) { ++ unsetDbname(); ++ } else { ++ setDbname((java.lang.String)value); ++ } ++ break; ++ ++ case TBL_NAME: ++ if (value == null) { ++ unsetTbl_name(); ++ } else { ++ setTbl_name((java.lang.String)value); ++ } ++ break; ++ ++ } ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.lang.Object getFieldValue(_Fields field) { ++ switch (field) { ++ case DBNAME: ++ return getDbname(); ++ ++ case TBL_NAME: ++ return getTbl_name(); ++ ++ } ++ throw new java.lang.IllegalStateException(); ++ } ++ ++ /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */ ++ public boolean isSet(_Fields field) { ++ if (field == null) { ++ throw new java.lang.IllegalArgumentException(); ++ } ++ ++ switch (field) { ++ case DBNAME: ++ return isSetDbname(); ++ case TBL_NAME: ++ return isSetTbl_name(); ++ } ++ throw new java.lang.IllegalStateException(); ++ } ++ ++ @Override ++ public boolean equals(java.lang.Object that) { ++ if (that instanceof get_table_args) ++ return this.equals((get_table_args)that); ++ return false; ++ } ++ ++ public boolean equals(get_table_args that) { ++ if (that == null) ++ return false; ++ if (this == that) ++ return true; ++ ++ boolean this_present_dbname = true && this.isSetDbname(); ++ boolean that_present_dbname = true && that.isSetDbname(); ++ if (this_present_dbname || that_present_dbname) { ++ if (!(this_present_dbname && that_present_dbname)) ++ return false; ++ if (!this.dbname.equals(that.dbname)) ++ return false; ++ } ++ ++ boolean this_present_tbl_name = true && this.isSetTbl_name(); ++ boolean that_present_tbl_name = true && that.isSetTbl_name(); ++ if (this_present_tbl_name || that_present_tbl_name) { ++ if (!(this_present_tbl_name && that_present_tbl_name)) ++ return false; ++ if (!this.tbl_name.equals(that.tbl_name)) ++ return false; ++ } ++ ++ return true; ++ } ++ ++ @Override ++ public int hashCode() { ++ int hashCode = 1; ++ ++ hashCode = hashCode * 8191 + ((isSetDbname()) ? 131071 : 524287); ++ if (isSetDbname()) ++ hashCode = hashCode * 8191 + dbname.hashCode(); ++ ++ hashCode = hashCode * 8191 + ((isSetTbl_name()) ? 131071 : 524287); ++ if (isSetTbl_name()) ++ hashCode = hashCode * 8191 + tbl_name.hashCode(); ++ ++ return hashCode; ++ } ++ ++ @Override ++ public int compareTo(get_table_args other) { ++ if (!getClass().equals(other.getClass())) { ++ return getClass().getName().compareTo(other.getClass().getName()); ++ } ++ ++ int lastComparison = 0; ++ ++ lastComparison = java.lang.Boolean.compare(isSetDbname(), other.isSetDbname()); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ if (isSetDbname()) { ++ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.dbname, other.dbname); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ } ++ lastComparison = java.lang.Boolean.compare(isSetTbl_name(), other.isSetTbl_name()); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ if (isSetTbl_name()) { ++ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.tbl_name, other.tbl_name); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ } ++ return 0; ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public _Fields fieldForId(int fieldId) { ++ return _Fields.findByThriftId(fieldId); ++ } ++ ++ public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException { ++ scheme(iprot).read(iprot, this); ++ } ++ ++ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException { ++ scheme(oprot).write(oprot, this); ++ } ++ ++ @Override ++ public java.lang.String toString() { ++ java.lang.StringBuilder sb = new java.lang.StringBuilder("get_table_args("); ++ boolean first = true; ++ ++ sb.append("dbname:"); ++ if (this.dbname == null) { ++ sb.append("null"); ++ } else { ++ sb.append(this.dbname); ++ } ++ first = false; ++ if (!first) sb.append(", "); ++ sb.append("tbl_name:"); ++ if (this.tbl_name == null) { ++ sb.append("null"); ++ } else { ++ sb.append(this.tbl_name); ++ } ++ first = false; ++ sb.append(")"); ++ return sb.toString(); ++ } ++ ++ public void validate() throws org.apache.thrift.TException { ++ // check for required fields ++ // check for sub-struct validity ++ } ++ ++ private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { ++ try { ++ write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out))); ++ } catch (org.apache.thrift.TException te) { ++ throw new java.io.IOException(te); ++ } ++ } ++ ++ private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException { ++ try { ++ read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in))); ++ } catch (org.apache.thrift.TException te) { ++ throw new java.io.IOException(te); ++ } ++ } ++ ++ private static class get_table_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { ++ public get_table_argsStandardScheme getScheme() { ++ return new get_table_argsStandardScheme(); ++ } ++ } ++ ++ private static class get_table_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme { ++ ++ public void read(org.apache.thrift.protocol.TProtocol iprot, get_table_args struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TField schemeField; ++ iprot.readStructBegin(); ++ while (true) ++ { ++ schemeField = iprot.readFieldBegin(); ++ if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { ++ break; ++ } ++ switch (schemeField.id) { ++ case 1: // DBNAME ++ if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { ++ struct.dbname = iprot.readString(); ++ struct.setDbnameIsSet(true); ++ } else { ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ break; ++ case 2: // TBL_NAME ++ if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { ++ struct.tbl_name = iprot.readString(); ++ struct.setTbl_nameIsSet(true); ++ } else { ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ break; ++ default: ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ iprot.readFieldEnd(); ++ } ++ iprot.readStructEnd(); ++ struct.validate(); ++ } ++ ++ public void write(org.apache.thrift.protocol.TProtocol oprot, get_table_args struct) throws org.apache.thrift.TException { ++ struct.validate(); ++ ++ oprot.writeStructBegin(STRUCT_DESC); ++ if (struct.dbname != null) { ++ oprot.writeFieldBegin(DBNAME_FIELD_DESC); ++ oprot.writeString(struct.dbname); ++ oprot.writeFieldEnd(); ++ } ++ if (struct.tbl_name != null) { ++ oprot.writeFieldBegin(TBL_NAME_FIELD_DESC); ++ oprot.writeString(struct.tbl_name); ++ oprot.writeFieldEnd(); ++ } ++ oprot.writeFieldStop(); ++ oprot.writeStructEnd(); ++ } ++ ++ } ++ ++ private static class get_table_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { ++ public get_table_argsTupleScheme getScheme() { ++ return new get_table_argsTupleScheme(); ++ } ++ } ++ ++ private static class get_table_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme { ++ ++ @Override ++ public void write(org.apache.thrift.protocol.TProtocol prot, get_table_args struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot; ++ java.util.BitSet optionals = new java.util.BitSet(); ++ if (struct.isSetDbname()) { ++ optionals.set(0); ++ } ++ if (struct.isSetTbl_name()) { ++ optionals.set(1); ++ } ++ oprot.writeBitSet(optionals, 2); ++ if (struct.isSetDbname()) { ++ oprot.writeString(struct.dbname); ++ } ++ if (struct.isSetTbl_name()) { ++ oprot.writeString(struct.tbl_name); ++ } ++ } ++ ++ @Override ++ public void read(org.apache.thrift.protocol.TProtocol prot, get_table_args struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot; ++ java.util.BitSet incoming = iprot.readBitSet(2); ++ if (incoming.get(0)) { ++ struct.dbname = iprot.readString(); ++ struct.setDbnameIsSet(true); ++ } ++ if (incoming.get(1)) { ++ struct.tbl_name = iprot.readString(); ++ struct.setTbl_nameIsSet(true); ++ } ++ } ++ } ++ ++ private static S scheme(org.apache.thrift.protocol.TProtocol proto) { ++ return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme(); ++ } ++ } ++ ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table_result implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { ++ private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("get_table_result"); ++ ++ private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField("success", org.apache.thrift.protocol.TType.STRUCT, (short)0); ++ private static final org.apache.thrift.protocol.TField O1_FIELD_DESC = new org.apache.thrift.protocol.TField("o1", org.apache.thrift.protocol.TType.STRUCT, (short)1); ++ private static final org.apache.thrift.protocol.TField O2_FIELD_DESC = new org.apache.thrift.protocol.TField("o2", org.apache.thrift.protocol.TType.STRUCT, (short)2); ++ ++ private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new get_table_resultStandardSchemeFactory(); ++ private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new get_table_resultTupleSchemeFactory(); ++ ++ private @org.apache.thrift.annotation.Nullable Table success; // required ++ private @org.apache.thrift.annotation.Nullable MetaException o1; // required ++ private @org.apache.thrift.annotation.Nullable NoSuchObjectException o2; // required ++ ++ /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ ++ public enum _Fields implements org.apache.thrift.TFieldIdEnum { ++ SUCCESS((short)0, "success"), ++ O1((short)1, "o1"), ++ O2((short)2, "o2"); ++ ++ private static final java.util.Map byName = new java.util.HashMap(); ++ ++ static { ++ for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) { ++ byName.put(field.getFieldName(), field); ++ } ++ } ++ ++ /** ++ * Find the _Fields constant that matches fieldId, or null if its not found. ++ */ ++ @org.apache.thrift.annotation.Nullable ++ public static _Fields findByThriftId(int fieldId) { ++ switch(fieldId) { ++ case 0: // SUCCESS ++ return SUCCESS; ++ case 1: // O1 ++ return O1; ++ case 2: // O2 ++ return O2; ++ default: ++ return null; ++ } ++ } ++ ++ /** ++ * Find the _Fields constant that matches fieldId, throwing an exception ++ * if it is not found. ++ */ ++ public static _Fields findByThriftIdOrThrow(int fieldId) { ++ _Fields fields = findByThriftId(fieldId); ++ if (fields == null) throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!"); ++ return fields; ++ } ++ ++ /** ++ * Find the _Fields constant that matches name, or null if its not found. ++ */ ++ @org.apache.thrift.annotation.Nullable ++ public static _Fields findByName(java.lang.String name) { ++ return byName.get(name); ++ } ++ ++ private final short _thriftId; ++ private final java.lang.String _fieldName; ++ ++ _Fields(short thriftId, java.lang.String fieldName) { ++ _thriftId = thriftId; ++ _fieldName = fieldName; ++ } ++ ++ public short getThriftFieldId() { ++ return _thriftId; ++ } ++ ++ public java.lang.String getFieldName() { ++ return _fieldName; ++ } ++ } ++ ++ // isset id assignments ++ public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; ++ static { ++ java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); ++ tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData("success", org.apache.thrift.TFieldRequirementType.DEFAULT, ++ new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, Table.class))); ++ tmpMap.put(_Fields.O1, new org.apache.thrift.meta_data.FieldMetaData("o1", org.apache.thrift.TFieldRequirementType.DEFAULT, ++ new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, MetaException.class))); ++ tmpMap.put(_Fields.O2, new org.apache.thrift.meta_data.FieldMetaData("o2", org.apache.thrift.TFieldRequirementType.DEFAULT, ++ new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, NoSuchObjectException.class))); ++ metaDataMap = java.util.Collections.unmodifiableMap(tmpMap); ++ org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(get_table_result.class, metaDataMap); ++ } ++ ++ public get_table_result() { ++ } ++ ++ public get_table_result( ++ Table success, ++ MetaException o1, ++ NoSuchObjectException o2) ++ { ++ this(); ++ this.success = success; ++ this.o1 = o1; ++ this.o2 = o2; ++ } ++ ++ /** ++ * Performs a deep copy on other. ++ */ ++ public get_table_result(get_table_result other) { ++ if (other.isSetSuccess()) { ++ this.success = new Table(other.success); ++ } ++ if (other.isSetO1()) { ++ this.o1 = new MetaException(other.o1); ++ } ++ if (other.isSetO2()) { ++ this.o2 = new NoSuchObjectException(other.o2); ++ } ++ } ++ ++ public get_table_result deepCopy() { ++ return new get_table_result(this); ++ } ++ ++ @Override ++ public void clear() { ++ this.success = null; ++ this.o1 = null; ++ this.o2 = null; ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public Table getSuccess() { ++ return this.success; ++ } ++ ++ public void setSuccess(@org.apache.thrift.annotation.Nullable Table success) { ++ this.success = success; ++ } ++ ++ public void unsetSuccess() { ++ this.success = null; ++ } ++ ++ /** Returns true if field success is set (has been assigned a value) and false otherwise */ ++ public boolean isSetSuccess() { ++ return this.success != null; ++ } ++ ++ public void setSuccessIsSet(boolean value) { ++ if (!value) { ++ this.success = null; ++ } ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public MetaException getO1() { ++ return this.o1; ++ } ++ ++ public void setO1(@org.apache.thrift.annotation.Nullable MetaException o1) { ++ this.o1 = o1; ++ } ++ ++ public void unsetO1() { ++ this.o1 = null; ++ } ++ ++ /** Returns true if field o1 is set (has been assigned a value) and false otherwise */ ++ public boolean isSetO1() { ++ return this.o1 != null; ++ } ++ ++ public void setO1IsSet(boolean value) { ++ if (!value) { ++ this.o1 = null; ++ } ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public NoSuchObjectException getO2() { ++ return this.o2; ++ } ++ ++ public void setO2(@org.apache.thrift.annotation.Nullable NoSuchObjectException o2) { ++ this.o2 = o2; ++ } ++ ++ public void unsetO2() { ++ this.o2 = null; ++ } ++ ++ /** Returns true if field o2 is set (has been assigned a value) and false otherwise */ ++ public boolean isSetO2() { ++ return this.o2 != null; ++ } ++ ++ public void setO2IsSet(boolean value) { ++ if (!value) { ++ this.o2 = null; ++ } ++ } ++ ++ public void setFieldValue(_Fields field, @org.apache.thrift.annotation.Nullable java.lang.Object value) { ++ switch (field) { ++ case SUCCESS: ++ if (value == null) { ++ unsetSuccess(); ++ } else { ++ setSuccess((Table)value); ++ } ++ break; ++ ++ case O1: ++ if (value == null) { ++ unsetO1(); ++ } else { ++ setO1((MetaException)value); ++ } ++ break; ++ ++ case O2: ++ if (value == null) { ++ unsetO2(); ++ } else { ++ setO2((NoSuchObjectException)value); ++ } ++ break; ++ ++ } ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.lang.Object getFieldValue(_Fields field) { ++ switch (field) { ++ case SUCCESS: ++ return getSuccess(); ++ ++ case O1: ++ return getO1(); ++ ++ case O2: ++ return getO2(); ++ ++ } ++ throw new java.lang.IllegalStateException(); ++ } ++ ++ /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */ ++ public boolean isSet(_Fields field) { ++ if (field == null) { ++ throw new java.lang.IllegalArgumentException(); ++ } ++ ++ switch (field) { ++ case SUCCESS: ++ return isSetSuccess(); ++ case O1: ++ return isSetO1(); ++ case O2: ++ return isSetO2(); ++ } ++ throw new java.lang.IllegalStateException(); ++ } ++ ++ @Override ++ public boolean equals(java.lang.Object that) { ++ if (that instanceof get_table_result) ++ return this.equals((get_table_result)that); ++ return false; ++ } ++ ++ public boolean equals(get_table_result that) { ++ if (that == null) ++ return false; ++ if (this == that) ++ return true; ++ ++ boolean this_present_success = true && this.isSetSuccess(); ++ boolean that_present_success = true && that.isSetSuccess(); ++ if (this_present_success || that_present_success) { ++ if (!(this_present_success && that_present_success)) ++ return false; ++ if (!this.success.equals(that.success)) ++ return false; ++ } ++ ++ boolean this_present_o1 = true && this.isSetO1(); ++ boolean that_present_o1 = true && that.isSetO1(); ++ if (this_present_o1 || that_present_o1) { ++ if (!(this_present_o1 && that_present_o1)) ++ return false; ++ if (!this.o1.equals(that.o1)) ++ return false; ++ } ++ ++ boolean this_present_o2 = true && this.isSetO2(); ++ boolean that_present_o2 = true && that.isSetO2(); ++ if (this_present_o2 || that_present_o2) { ++ if (!(this_present_o2 && that_present_o2)) ++ return false; ++ if (!this.o2.equals(that.o2)) ++ return false; ++ } ++ ++ return true; ++ } ++ ++ @Override ++ public int hashCode() { ++ int hashCode = 1; ++ ++ hashCode = hashCode * 8191 + ((isSetSuccess()) ? 131071 : 524287); ++ if (isSetSuccess()) ++ hashCode = hashCode * 8191 + success.hashCode(); ++ ++ hashCode = hashCode * 8191 + ((isSetO1()) ? 131071 : 524287); ++ if (isSetO1()) ++ hashCode = hashCode * 8191 + o1.hashCode(); ++ ++ hashCode = hashCode * 8191 + ((isSetO2()) ? 131071 : 524287); ++ if (isSetO2()) ++ hashCode = hashCode * 8191 + o2.hashCode(); ++ ++ return hashCode; ++ } ++ ++ @Override ++ public int compareTo(get_table_result other) { ++ if (!getClass().equals(other.getClass())) { ++ return getClass().getName().compareTo(other.getClass().getName()); ++ } ++ ++ int lastComparison = 0; ++ ++ lastComparison = java.lang.Boolean.compare(isSetSuccess(), other.isSetSuccess()); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ if (isSetSuccess()) { ++ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ } ++ lastComparison = java.lang.Boolean.compare(isSetO1(), other.isSetO1()); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ if (isSetO1()) { ++ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.o1, other.o1); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ } ++ lastComparison = java.lang.Boolean.compare(isSetO2(), other.isSetO2()); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ if (isSetO2()) { ++ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.o2, other.o2); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ } ++ return 0; ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public _Fields fieldForId(int fieldId) { ++ return _Fields.findByThriftId(fieldId); ++ } ++ ++ public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException { ++ scheme(iprot).read(iprot, this); ++ } ++ ++ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException { ++ scheme(oprot).write(oprot, this); ++ } ++ ++ @Override ++ public java.lang.String toString() { ++ java.lang.StringBuilder sb = new java.lang.StringBuilder("get_table_result("); ++ boolean first = true; ++ ++ sb.append("success:"); ++ if (this.success == null) { ++ sb.append("null"); ++ } else { ++ sb.append(this.success); ++ } ++ first = false; ++ if (!first) sb.append(", "); ++ sb.append("o1:"); ++ if (this.o1 == null) { ++ sb.append("null"); ++ } else { ++ sb.append(this.o1); ++ } ++ first = false; ++ if (!first) sb.append(", "); ++ sb.append("o2:"); ++ if (this.o2 == null) { ++ sb.append("null"); ++ } else { ++ sb.append(this.o2); ++ } ++ first = false; ++ sb.append(")"); ++ return sb.toString(); ++ } ++ ++ public void validate() throws org.apache.thrift.TException { ++ // check for required fields ++ // check for sub-struct validity ++ if (success != null) { ++ success.validate(); ++ } ++ } ++ ++ private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { ++ try { ++ write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out))); ++ } catch (org.apache.thrift.TException te) { ++ throw new java.io.IOException(te); ++ } ++ } ++ ++ private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException { ++ try { ++ read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in))); ++ } catch (org.apache.thrift.TException te) { ++ throw new java.io.IOException(te); ++ } ++ } ++ ++ private static class get_table_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { ++ public get_table_resultStandardScheme getScheme() { ++ return new get_table_resultStandardScheme(); ++ } ++ } ++ ++ private static class get_table_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme { ++ ++ public void read(org.apache.thrift.protocol.TProtocol iprot, get_table_result struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TField schemeField; ++ iprot.readStructBegin(); ++ while (true) ++ { ++ schemeField = iprot.readFieldBegin(); ++ if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { ++ break; ++ } ++ switch (schemeField.id) { ++ case 0: // SUCCESS ++ if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) { ++ struct.success = new Table(); ++ struct.success.read(iprot); ++ struct.setSuccessIsSet(true); ++ } else { ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ break; ++ case 1: // O1 ++ if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) { ++ struct.o1 = new MetaException(); ++ struct.o1.read(iprot); ++ struct.setO1IsSet(true); ++ } else { ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ break; ++ case 2: // O2 ++ if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) { ++ struct.o2 = new NoSuchObjectException(); ++ struct.o2.read(iprot); ++ struct.setO2IsSet(true); ++ } else { ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ break; ++ default: ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ iprot.readFieldEnd(); ++ } ++ iprot.readStructEnd(); ++ struct.validate(); ++ } ++ ++ public void write(org.apache.thrift.protocol.TProtocol oprot, get_table_result struct) throws org.apache.thrift.TException { ++ struct.validate(); ++ ++ oprot.writeStructBegin(STRUCT_DESC); ++ if (struct.success != null) { ++ oprot.writeFieldBegin(SUCCESS_FIELD_DESC); ++ struct.success.write(oprot); ++ oprot.writeFieldEnd(); ++ } ++ if (struct.o1 != null) { ++ oprot.writeFieldBegin(O1_FIELD_DESC); ++ struct.o1.write(oprot); ++ oprot.writeFieldEnd(); ++ } ++ if (struct.o2 != null) { ++ oprot.writeFieldBegin(O2_FIELD_DESC); ++ struct.o2.write(oprot); ++ oprot.writeFieldEnd(); ++ } ++ oprot.writeFieldStop(); ++ oprot.writeStructEnd(); ++ } ++ ++ } ++ ++ private static class get_table_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { ++ public get_table_resultTupleScheme getScheme() { ++ return new get_table_resultTupleScheme(); ++ } ++ } ++ ++ private static class get_table_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme { ++ ++ @Override ++ public void write(org.apache.thrift.protocol.TProtocol prot, get_table_result struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot; ++ java.util.BitSet optionals = new java.util.BitSet(); ++ if (struct.isSetSuccess()) { ++ optionals.set(0); ++ } ++ if (struct.isSetO1()) { ++ optionals.set(1); ++ } ++ if (struct.isSetO2()) { ++ optionals.set(2); ++ } ++ oprot.writeBitSet(optionals, 3); ++ if (struct.isSetSuccess()) { ++ struct.success.write(oprot); ++ } ++ if (struct.isSetO1()) { ++ struct.o1.write(oprot); ++ } ++ if (struct.isSetO2()) { ++ struct.o2.write(oprot); ++ } ++ } ++ ++ @Override ++ public void read(org.apache.thrift.protocol.TProtocol prot, get_table_result struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot; ++ java.util.BitSet incoming = iprot.readBitSet(3); ++ if (incoming.get(0)) { ++ struct.success = new Table(); ++ struct.success.read(iprot); ++ struct.setSuccessIsSet(true); ++ } ++ if (incoming.get(1)) { ++ struct.o1 = new MetaException(); ++ struct.o1.read(iprot); ++ struct.setO1IsSet(true); ++ } ++ if (incoming.get(2)) { ++ struct.o2 = new NoSuchObjectException(); ++ struct.o2.read(iprot); ++ struct.setO2IsSet(true); ++ } ++ } ++ } ++ ++ private static S scheme(org.apache.thrift.protocol.TProtocol proto) { ++ return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme(); ++ } ++ } ++ ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table_objects_by_name_args implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { ++ private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("get_table_objects_by_name_args"); ++ ++ private static final org.apache.thrift.protocol.TField DBNAME_FIELD_DESC = new org.apache.thrift.protocol.TField("dbname", org.apache.thrift.protocol.TType.STRING, (short)1); ++ private static final org.apache.thrift.protocol.TField TBL_NAMES_FIELD_DESC = new org.apache.thrift.protocol.TField("tbl_names", org.apache.thrift.protocol.TType.LIST, (short)2); ++ ++ private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new get_table_objects_by_name_argsStandardSchemeFactory(); ++ private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new get_table_objects_by_name_argsTupleSchemeFactory(); ++ ++ private @org.apache.thrift.annotation.Nullable java.lang.String dbname; // required ++ private @org.apache.thrift.annotation.Nullable java.util.List tbl_names; // required ++ ++ /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ ++ public enum _Fields implements org.apache.thrift.TFieldIdEnum { ++ DBNAME((short)1, "dbname"), ++ TBL_NAMES((short)2, "tbl_names"); ++ ++ private static final java.util.Map byName = new java.util.HashMap(); ++ ++ static { ++ for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) { ++ byName.put(field.getFieldName(), field); ++ } ++ } ++ ++ /** ++ * Find the _Fields constant that matches fieldId, or null if its not found. ++ */ ++ @org.apache.thrift.annotation.Nullable ++ public static _Fields findByThriftId(int fieldId) { ++ switch(fieldId) { ++ case 1: // DBNAME ++ return DBNAME; ++ case 2: // TBL_NAMES ++ return TBL_NAMES; ++ default: ++ return null; ++ } ++ } ++ ++ /** ++ * Find the _Fields constant that matches fieldId, throwing an exception ++ * if it is not found. ++ */ ++ public static _Fields findByThriftIdOrThrow(int fieldId) { ++ _Fields fields = findByThriftId(fieldId); ++ if (fields == null) throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!"); ++ return fields; ++ } ++ ++ /** ++ * Find the _Fields constant that matches name, or null if its not found. ++ */ ++ @org.apache.thrift.annotation.Nullable ++ public static _Fields findByName(java.lang.String name) { ++ return byName.get(name); ++ } ++ ++ private final short _thriftId; ++ private final java.lang.String _fieldName; ++ ++ _Fields(short thriftId, java.lang.String fieldName) { ++ _thriftId = thriftId; ++ _fieldName = fieldName; ++ } ++ ++ public short getThriftFieldId() { ++ return _thriftId; ++ } ++ ++ public java.lang.String getFieldName() { ++ return _fieldName; ++ } ++ } ++ ++ // isset id assignments ++ public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; ++ static { ++ java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); ++ tmpMap.put(_Fields.DBNAME, new org.apache.thrift.meta_data.FieldMetaData("dbname", org.apache.thrift.TFieldRequirementType.DEFAULT, ++ new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))); ++ tmpMap.put(_Fields.TBL_NAMES, new org.apache.thrift.meta_data.FieldMetaData("tbl_names", org.apache.thrift.TFieldRequirementType.DEFAULT, ++ new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, ++ new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)))); ++ metaDataMap = java.util.Collections.unmodifiableMap(tmpMap); ++ org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(get_table_objects_by_name_args.class, metaDataMap); ++ } ++ ++ public get_table_objects_by_name_args() { ++ } ++ ++ public get_table_objects_by_name_args( ++ java.lang.String dbname, ++ java.util.List tbl_names) ++ { ++ this(); ++ this.dbname = dbname; ++ this.tbl_names = tbl_names; ++ } ++ ++ /** ++ * Performs a deep copy on other. ++ */ ++ public get_table_objects_by_name_args(get_table_objects_by_name_args other) { ++ if (other.isSetDbname()) { ++ this.dbname = other.dbname; ++ } ++ if (other.isSetTbl_names()) { ++ java.util.List __this__tbl_names = new java.util.ArrayList(other.tbl_names); ++ this.tbl_names = __this__tbl_names; ++ } ++ } ++ ++ public get_table_objects_by_name_args deepCopy() { ++ return new get_table_objects_by_name_args(this); ++ } ++ ++ @Override ++ public void clear() { ++ this.dbname = null; ++ this.tbl_names = null; ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.lang.String getDbname() { ++ return this.dbname; ++ } ++ ++ public void setDbname(@org.apache.thrift.annotation.Nullable java.lang.String dbname) { ++ this.dbname = dbname; ++ } ++ ++ public void unsetDbname() { ++ this.dbname = null; ++ } ++ ++ /** Returns true if field dbname is set (has been assigned a value) and false otherwise */ ++ public boolean isSetDbname() { ++ return this.dbname != null; ++ } ++ ++ public void setDbnameIsSet(boolean value) { ++ if (!value) { ++ this.dbname = null; ++ } ++ } ++ ++ public int getTbl_namesSize() { ++ return (this.tbl_names == null) ? 0 : this.tbl_names.size(); ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.util.Iterator getTbl_namesIterator() { ++ return (this.tbl_names == null) ? null : this.tbl_names.iterator(); ++ } ++ ++ public void addToTbl_names(java.lang.String elem) { ++ if (this.tbl_names == null) { ++ this.tbl_names = new java.util.ArrayList(); ++ } ++ this.tbl_names.add(elem); ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.util.List getTbl_names() { ++ return this.tbl_names; ++ } ++ ++ public void setTbl_names(@org.apache.thrift.annotation.Nullable java.util.List tbl_names) { ++ this.tbl_names = tbl_names; ++ } ++ ++ public void unsetTbl_names() { ++ this.tbl_names = null; ++ } ++ ++ /** Returns true if field tbl_names is set (has been assigned a value) and false otherwise */ ++ public boolean isSetTbl_names() { ++ return this.tbl_names != null; ++ } ++ ++ public void setTbl_namesIsSet(boolean value) { ++ if (!value) { ++ this.tbl_names = null; ++ } ++ } ++ ++ public void setFieldValue(_Fields field, @org.apache.thrift.annotation.Nullable java.lang.Object value) { ++ switch (field) { ++ case DBNAME: ++ if (value == null) { ++ unsetDbname(); ++ } else { ++ setDbname((java.lang.String)value); ++ } ++ break; ++ ++ case TBL_NAMES: ++ if (value == null) { ++ unsetTbl_names(); ++ } else { ++ setTbl_names((java.util.List)value); ++ } ++ break; ++ ++ } ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.lang.Object getFieldValue(_Fields field) { ++ switch (field) { ++ case DBNAME: ++ return getDbname(); ++ ++ case TBL_NAMES: ++ return getTbl_names(); ++ ++ } ++ throw new java.lang.IllegalStateException(); ++ } ++ ++ /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */ ++ public boolean isSet(_Fields field) { ++ if (field == null) { ++ throw new java.lang.IllegalArgumentException(); ++ } ++ ++ switch (field) { ++ case DBNAME: ++ return isSetDbname(); ++ case TBL_NAMES: ++ return isSetTbl_names(); ++ } ++ throw new java.lang.IllegalStateException(); ++ } ++ ++ @Override ++ public boolean equals(java.lang.Object that) { ++ if (that instanceof get_table_objects_by_name_args) ++ return this.equals((get_table_objects_by_name_args)that); ++ return false; ++ } ++ ++ public boolean equals(get_table_objects_by_name_args that) { ++ if (that == null) ++ return false; ++ if (this == that) ++ return true; ++ ++ boolean this_present_dbname = true && this.isSetDbname(); ++ boolean that_present_dbname = true && that.isSetDbname(); ++ if (this_present_dbname || that_present_dbname) { ++ if (!(this_present_dbname && that_present_dbname)) ++ return false; ++ if (!this.dbname.equals(that.dbname)) ++ return false; ++ } ++ ++ boolean this_present_tbl_names = true && this.isSetTbl_names(); ++ boolean that_present_tbl_names = true && that.isSetTbl_names(); ++ if (this_present_tbl_names || that_present_tbl_names) { ++ if (!(this_present_tbl_names && that_present_tbl_names)) ++ return false; ++ if (!this.tbl_names.equals(that.tbl_names)) ++ return false; ++ } ++ ++ return true; ++ } ++ ++ @Override ++ public int hashCode() { ++ int hashCode = 1; ++ ++ hashCode = hashCode * 8191 + ((isSetDbname()) ? 131071 : 524287); ++ if (isSetDbname()) ++ hashCode = hashCode * 8191 + dbname.hashCode(); ++ ++ hashCode = hashCode * 8191 + ((isSetTbl_names()) ? 131071 : 524287); ++ if (isSetTbl_names()) ++ hashCode = hashCode * 8191 + tbl_names.hashCode(); ++ ++ return hashCode; ++ } ++ ++ @Override ++ public int compareTo(get_table_objects_by_name_args other) { ++ if (!getClass().equals(other.getClass())) { ++ return getClass().getName().compareTo(other.getClass().getName()); ++ } ++ ++ int lastComparison = 0; ++ ++ lastComparison = java.lang.Boolean.compare(isSetDbname(), other.isSetDbname()); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ if (isSetDbname()) { ++ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.dbname, other.dbname); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ } ++ lastComparison = java.lang.Boolean.compare(isSetTbl_names(), other.isSetTbl_names()); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ if (isSetTbl_names()) { ++ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.tbl_names, other.tbl_names); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ } ++ return 0; ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public _Fields fieldForId(int fieldId) { ++ return _Fields.findByThriftId(fieldId); ++ } ++ ++ public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException { ++ scheme(iprot).read(iprot, this); ++ } ++ ++ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException { ++ scheme(oprot).write(oprot, this); ++ } ++ ++ @Override ++ public java.lang.String toString() { ++ java.lang.StringBuilder sb = new java.lang.StringBuilder("get_table_objects_by_name_args("); ++ boolean first = true; ++ ++ sb.append("dbname:"); ++ if (this.dbname == null) { ++ sb.append("null"); ++ } else { ++ sb.append(this.dbname); ++ } ++ first = false; ++ if (!first) sb.append(", "); ++ sb.append("tbl_names:"); ++ if (this.tbl_names == null) { ++ sb.append("null"); ++ } else { ++ sb.append(this.tbl_names); ++ } ++ first = false; ++ sb.append(")"); ++ return sb.toString(); ++ } ++ ++ public void validate() throws org.apache.thrift.TException { ++ // check for required fields ++ // check for sub-struct validity ++ } ++ ++ private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { ++ try { ++ write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out))); ++ } catch (org.apache.thrift.TException te) { ++ throw new java.io.IOException(te); ++ } ++ } ++ ++ private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException { ++ try { ++ read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in))); ++ } catch (org.apache.thrift.TException te) { ++ throw new java.io.IOException(te); ++ } ++ } ++ ++ private static class get_table_objects_by_name_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { ++ public get_table_objects_by_name_argsStandardScheme getScheme() { ++ return new get_table_objects_by_name_argsStandardScheme(); ++ } ++ } ++ ++ private static class get_table_objects_by_name_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme { ++ ++ public void read(org.apache.thrift.protocol.TProtocol iprot, get_table_objects_by_name_args struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TField schemeField; ++ iprot.readStructBegin(); ++ while (true) ++ { ++ schemeField = iprot.readFieldBegin(); ++ if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { ++ break; ++ } ++ switch (schemeField.id) { ++ case 1: // DBNAME ++ if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { ++ struct.dbname = iprot.readString(); ++ struct.setDbnameIsSet(true); ++ } else { ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ break; ++ case 2: // TBL_NAMES ++ if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { ++ { ++ org.apache.thrift.protocol.TList _list2282 = iprot.readListBegin(); ++ struct.tbl_names = new java.util.ArrayList(_list2282.size); ++ @org.apache.thrift.annotation.Nullable java.lang.String _elem2283; ++ for (int _i2284 = 0; _i2284 < _list2282.size; ++_i2284) ++ { ++ _elem2283 = iprot.readString(); ++ struct.tbl_names.add(_elem2283); ++ } ++ iprot.readListEnd(); ++ } ++ struct.setTbl_namesIsSet(true); ++ } else { ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ break; ++ default: ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ iprot.readFieldEnd(); ++ } ++ iprot.readStructEnd(); ++ struct.validate(); ++ } ++ ++ public void write(org.apache.thrift.protocol.TProtocol oprot, get_table_objects_by_name_args struct) throws org.apache.thrift.TException { ++ struct.validate(); ++ ++ oprot.writeStructBegin(STRUCT_DESC); ++ if (struct.dbname != null) { ++ oprot.writeFieldBegin(DBNAME_FIELD_DESC); ++ oprot.writeString(struct.dbname); ++ oprot.writeFieldEnd(); ++ } ++ if (struct.tbl_names != null) { ++ oprot.writeFieldBegin(TBL_NAMES_FIELD_DESC); ++ { ++ oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, struct.tbl_names.size())); ++ for (java.lang.String _iter2285 : struct.tbl_names) ++ { ++ oprot.writeString(_iter2285); ++ } ++ oprot.writeListEnd(); ++ } ++ oprot.writeFieldEnd(); ++ } ++ oprot.writeFieldStop(); ++ oprot.writeStructEnd(); ++ } ++ ++ } ++ ++ private static class get_table_objects_by_name_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { ++ public get_table_objects_by_name_argsTupleScheme getScheme() { ++ return new get_table_objects_by_name_argsTupleScheme(); ++ } ++ } ++ ++ private static class get_table_objects_by_name_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme { ++ ++ @Override ++ public void write(org.apache.thrift.protocol.TProtocol prot, get_table_objects_by_name_args struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot; ++ java.util.BitSet optionals = new java.util.BitSet(); ++ if (struct.isSetDbname()) { ++ optionals.set(0); ++ } ++ if (struct.isSetTbl_names()) { ++ optionals.set(1); ++ } ++ oprot.writeBitSet(optionals, 2); ++ if (struct.isSetDbname()) { ++ oprot.writeString(struct.dbname); ++ } ++ if (struct.isSetTbl_names()) { ++ { ++ oprot.writeI32(struct.tbl_names.size()); ++ for (java.lang.String _iter2286 : struct.tbl_names) ++ { ++ oprot.writeString(_iter2286); ++ } ++ } ++ } ++ } ++ ++ @Override ++ public void read(org.apache.thrift.protocol.TProtocol prot, get_table_objects_by_name_args struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot; ++ java.util.BitSet incoming = iprot.readBitSet(2); ++ if (incoming.get(0)) { ++ struct.dbname = iprot.readString(); ++ struct.setDbnameIsSet(true); ++ } ++ if (incoming.get(1)) { ++ { ++ org.apache.thrift.protocol.TList _list2287 = iprot.readListBegin(org.apache.thrift.protocol.TType.STRING); ++ struct.tbl_names = new java.util.ArrayList(_list2287.size); ++ @org.apache.thrift.annotation.Nullable java.lang.String _elem2288; ++ for (int _i2289 = 0; _i2289 < _list2287.size; ++_i2289) ++ { ++ _elem2288 = iprot.readString(); ++ struct.tbl_names.add(_elem2288); ++ } ++ } ++ struct.setTbl_namesIsSet(true); ++ } ++ } ++ } ++ ++ private static S scheme(org.apache.thrift.protocol.TProtocol proto) { ++ return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme(); ++ } ++ } ++ ++ @org.apache.hadoop.classification.InterfaceAudience.Public @org.apache.hadoop.classification.InterfaceStability.Stable public static class get_table_objects_by_name_result implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { ++ private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("get_table_objects_by_name_result"); ++ ++ private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField("success", org.apache.thrift.protocol.TType.LIST, (short)0); ++ ++ private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new get_table_objects_by_name_resultStandardSchemeFactory(); ++ private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new get_table_objects_by_name_resultTupleSchemeFactory(); ++ ++ private @org.apache.thrift.annotation.Nullable java.util.List
success; // required ++ ++ /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ ++ public enum _Fields implements org.apache.thrift.TFieldIdEnum { ++ SUCCESS((short)0, "success"); ++ ++ private static final java.util.Map byName = new java.util.HashMap(); ++ ++ static { ++ for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) { ++ byName.put(field.getFieldName(), field); ++ } ++ } ++ ++ /** ++ * Find the _Fields constant that matches fieldId, or null if its not found. ++ */ ++ @org.apache.thrift.annotation.Nullable ++ public static _Fields findByThriftId(int fieldId) { ++ switch(fieldId) { ++ case 0: // SUCCESS ++ return SUCCESS; ++ default: ++ return null; ++ } ++ } ++ ++ /** ++ * Find the _Fields constant that matches fieldId, throwing an exception ++ * if it is not found. ++ */ ++ public static _Fields findByThriftIdOrThrow(int fieldId) { ++ _Fields fields = findByThriftId(fieldId); ++ if (fields == null) throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!"); ++ return fields; ++ } ++ ++ /** ++ * Find the _Fields constant that matches name, or null if its not found. ++ */ ++ @org.apache.thrift.annotation.Nullable ++ public static _Fields findByName(java.lang.String name) { ++ return byName.get(name); ++ } ++ ++ private final short _thriftId; ++ private final java.lang.String _fieldName; ++ ++ _Fields(short thriftId, java.lang.String fieldName) { ++ _thriftId = thriftId; ++ _fieldName = fieldName; ++ } ++ ++ public short getThriftFieldId() { ++ return _thriftId; ++ } ++ ++ public java.lang.String getFieldName() { ++ return _fieldName; ++ } ++ } ++ ++ // isset id assignments ++ public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; ++ static { ++ java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); ++ tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData("success", org.apache.thrift.TFieldRequirementType.DEFAULT, ++ new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, ++ new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, Table.class)))); ++ metaDataMap = java.util.Collections.unmodifiableMap(tmpMap); ++ org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(get_table_objects_by_name_result.class, metaDataMap); ++ } ++ ++ public get_table_objects_by_name_result() { ++ } ++ ++ public get_table_objects_by_name_result( ++ java.util.List
success) ++ { ++ this(); ++ this.success = success; ++ } ++ ++ /** ++ * Performs a deep copy on other. ++ */ ++ public get_table_objects_by_name_result(get_table_objects_by_name_result other) { ++ if (other.isSetSuccess()) { ++ java.util.List
__this__success = new java.util.ArrayList
(other.success.size()); ++ for (Table other_element : other.success) { ++ __this__success.add(new Table(other_element)); ++ } ++ this.success = __this__success; ++ } ++ } ++ ++ public get_table_objects_by_name_result deepCopy() { ++ return new get_table_objects_by_name_result(this); ++ } ++ ++ @Override ++ public void clear() { ++ this.success = null; ++ } ++ ++ public int getSuccessSize() { ++ return (this.success == null) ? 0 : this.success.size(); ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.util.Iterator
getSuccessIterator() { ++ return (this.success == null) ? null : this.success.iterator(); ++ } ++ ++ public void addToSuccess(Table elem) { ++ if (this.success == null) { ++ this.success = new java.util.ArrayList
(); ++ } ++ this.success.add(elem); ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.util.List
getSuccess() { ++ return this.success; ++ } ++ ++ public void setSuccess(@org.apache.thrift.annotation.Nullable java.util.List
success) { ++ this.success = success; ++ } ++ ++ public void unsetSuccess() { ++ this.success = null; ++ } ++ ++ /** Returns true if field success is set (has been assigned a value) and false otherwise */ ++ public boolean isSetSuccess() { ++ return this.success != null; ++ } ++ ++ public void setSuccessIsSet(boolean value) { ++ if (!value) { ++ this.success = null; ++ } ++ } ++ ++ public void setFieldValue(_Fields field, @org.apache.thrift.annotation.Nullable java.lang.Object value) { ++ switch (field) { ++ case SUCCESS: ++ if (value == null) { ++ unsetSuccess(); ++ } else { ++ setSuccess((java.util.List
)value); ++ } ++ break; ++ ++ } ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public java.lang.Object getFieldValue(_Fields field) { ++ switch (field) { ++ case SUCCESS: ++ return getSuccess(); ++ ++ } ++ throw new java.lang.IllegalStateException(); ++ } ++ ++ /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */ ++ public boolean isSet(_Fields field) { ++ if (field == null) { ++ throw new java.lang.IllegalArgumentException(); ++ } ++ ++ switch (field) { ++ case SUCCESS: ++ return isSetSuccess(); ++ } ++ throw new java.lang.IllegalStateException(); ++ } ++ ++ @Override ++ public boolean equals(java.lang.Object that) { ++ if (that instanceof get_table_objects_by_name_result) ++ return this.equals((get_table_objects_by_name_result)that); ++ return false; ++ } ++ ++ public boolean equals(get_table_objects_by_name_result that) { ++ if (that == null) ++ return false; ++ if (this == that) ++ return true; ++ ++ boolean this_present_success = true && this.isSetSuccess(); ++ boolean that_present_success = true && that.isSetSuccess(); ++ if (this_present_success || that_present_success) { ++ if (!(this_present_success && that_present_success)) ++ return false; ++ if (!this.success.equals(that.success)) ++ return false; ++ } ++ ++ return true; ++ } ++ ++ @Override ++ public int hashCode() { ++ int hashCode = 1; ++ ++ hashCode = hashCode * 8191 + ((isSetSuccess()) ? 131071 : 524287); ++ if (isSetSuccess()) ++ hashCode = hashCode * 8191 + success.hashCode(); ++ ++ return hashCode; ++ } ++ ++ @Override ++ public int compareTo(get_table_objects_by_name_result other) { ++ if (!getClass().equals(other.getClass())) { ++ return getClass().getName().compareTo(other.getClass().getName()); ++ } ++ ++ int lastComparison = 0; ++ ++ lastComparison = java.lang.Boolean.compare(isSetSuccess(), other.isSetSuccess()); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ if (isSetSuccess()) { ++ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success); ++ if (lastComparison != 0) { ++ return lastComparison; ++ } ++ } ++ return 0; ++ } ++ ++ @org.apache.thrift.annotation.Nullable ++ public _Fields fieldForId(int fieldId) { ++ return _Fields.findByThriftId(fieldId); ++ } ++ ++ public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException { ++ scheme(iprot).read(iprot, this); ++ } ++ ++ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException { ++ scheme(oprot).write(oprot, this); ++ } ++ ++ @Override ++ public java.lang.String toString() { ++ java.lang.StringBuilder sb = new java.lang.StringBuilder("get_table_objects_by_name_result("); ++ boolean first = true; ++ ++ sb.append("success:"); ++ if (this.success == null) { ++ sb.append("null"); ++ } else { ++ sb.append(this.success); ++ } ++ first = false; ++ sb.append(")"); ++ return sb.toString(); ++ } ++ ++ public void validate() throws org.apache.thrift.TException { ++ // check for required fields ++ // check for sub-struct validity ++ } ++ ++ private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { ++ try { ++ write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out))); ++ } catch (org.apache.thrift.TException te) { ++ throw new java.io.IOException(te); ++ } ++ } ++ ++ private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException { ++ try { ++ read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in))); ++ } catch (org.apache.thrift.TException te) { ++ throw new java.io.IOException(te); ++ } ++ } ++ ++ private static class get_table_objects_by_name_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { ++ public get_table_objects_by_name_resultStandardScheme getScheme() { ++ return new get_table_objects_by_name_resultStandardScheme(); ++ } ++ } ++ ++ private static class get_table_objects_by_name_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme { ++ ++ public void read(org.apache.thrift.protocol.TProtocol iprot, get_table_objects_by_name_result struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TField schemeField; ++ iprot.readStructBegin(); ++ while (true) ++ { ++ schemeField = iprot.readFieldBegin(); ++ if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { ++ break; ++ } ++ switch (schemeField.id) { ++ case 0: // SUCCESS ++ if (schemeField.type == org.apache.thrift.protocol.TType.LIST) { ++ { ++ org.apache.thrift.protocol.TList _list2290 = iprot.readListBegin(); ++ struct.success = new java.util.ArrayList
(_list2290.size); ++ @org.apache.thrift.annotation.Nullable Table _elem2291; ++ for (int _i2292 = 0; _i2292 < _list2290.size; ++_i2292) ++ { ++ _elem2291 = new Table(); ++ _elem2291.read(iprot); ++ struct.success.add(_elem2291); ++ } ++ iprot.readListEnd(); ++ } ++ struct.setSuccessIsSet(true); ++ } else { ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ break; ++ default: ++ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); ++ } ++ iprot.readFieldEnd(); ++ } ++ iprot.readStructEnd(); ++ struct.validate(); ++ } ++ ++ public void write(org.apache.thrift.protocol.TProtocol oprot, get_table_objects_by_name_result struct) throws org.apache.thrift.TException { ++ struct.validate(); ++ ++ oprot.writeStructBegin(STRUCT_DESC); ++ if (struct.success != null) { ++ oprot.writeFieldBegin(SUCCESS_FIELD_DESC); ++ { ++ oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.success.size())); ++ for (Table _iter2293 : struct.success) ++ { ++ _iter2293.write(oprot); ++ } ++ oprot.writeListEnd(); ++ } ++ oprot.writeFieldEnd(); ++ } ++ oprot.writeFieldStop(); ++ oprot.writeStructEnd(); ++ } ++ ++ } ++ ++ private static class get_table_objects_by_name_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { ++ public get_table_objects_by_name_resultTupleScheme getScheme() { ++ return new get_table_objects_by_name_resultTupleScheme(); ++ } ++ } ++ ++ private static class get_table_objects_by_name_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme { ++ ++ @Override ++ public void write(org.apache.thrift.protocol.TProtocol prot, get_table_objects_by_name_result struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot; ++ java.util.BitSet optionals = new java.util.BitSet(); ++ if (struct.isSetSuccess()) { ++ optionals.set(0); ++ } ++ oprot.writeBitSet(optionals, 1); ++ if (struct.isSetSuccess()) { ++ { ++ oprot.writeI32(struct.success.size()); ++ for (Table _iter2294 : struct.success) ++ { ++ _iter2294.write(oprot); ++ } ++ } ++ } ++ } ++ ++ @Override ++ public void read(org.apache.thrift.protocol.TProtocol prot, get_table_objects_by_name_result struct) throws org.apache.thrift.TException { ++ org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot; ++ java.util.BitSet incoming = iprot.readBitSet(1); ++ if (incoming.get(0)) { ++ { ++ org.apache.thrift.protocol.TList _list2295 = iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT); ++ struct.success = new java.util.ArrayList
(_list2295.size); ++ @org.apache.thrift.annotation.Nullable Table _elem2296; ++ for (int _i2297 = 0; _i2297 < _list2295.size; ++_i2297) ++ { ++ _elem2296 = new Table(); ++ _elem2296.read(iprot); ++ struct.success.add(_elem2296); ++ } ++ } ++ struct.setSuccessIsSet(true); ++ } ++ } ++ } ++ ++ private static S scheme(org.apache.thrift.protocol.TProtocol proto) { ++ return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme(); ++ } ++ } ++ + } +diff --git a/standalone-metastore/metastore-common/src/main/thrift/hive_metastore.thrift b/standalone-metastore/metastore-common/src/main/thrift/hive_metastore.thrift +index 32071a087b..57fe135d13 100644 +--- a/standalone-metastore/metastore-common/src/main/thrift/hive_metastore.thrift ++++ b/standalone-metastore/metastore-common/src/main/thrift/hive_metastore.thrift +@@ -3325,6 +3325,19 @@ PartitionsResponse get_partitions_req(1:PartitionsRequest req) + void drop_package(1: DropPackageRequest request) throws (1:MetaException o1) + list get_all_write_event_info(1: GetAllWriteEventInfoRequest request) throws (1:MetaException o1) + ReplayedTxnsForPolicyResult get_replayed_txns_for_policy(1: string policyName) throws (1: MetaException o1) ++ ++ // Restored for wire compatibility with metastore clients built against Hive 2.3, ++ // which is what Spark bundles. HIVE-26537 removed these two methods in 4.0.1 as a ++ // code cleanup; the request-based variants below are their replacements and both ++ // entry points share one implementation. ++ // ++ // Appended at the end of the service block on purpose: thrift numbers its generated ++ // local variables in declaration order, so inserting these where they used to live ++ // renumbers thousands of unrelated lines in the checked-in generated sources. ++ // Dispatch is by name, so the position has no effect on the wire. ++ Table get_table(1:string dbname, 2:string tbl_name) ++ throws (1:MetaException o1, 2:NoSuchObjectException o2) ++ list
get_table_objects_by_name(1:string dbname, 2:list tbl_names) + } + + // * Note about the DDL_TIME: When creating or altering a table or a partition, +diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java +index 7ab569383a..40bbc51571 100644 +--- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java ++++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HMSHandler.java +@@ -3632,6 +3632,16 @@ public class HMSHandler extends FacebookBase implements IHMSHandler { + return extTable; + } + ++ @Override ++ @Deprecated ++ public Table get_table(final String dbname, final String name) throws MetaException, ++ NoSuchObjectException { ++ String[] parsedDbName = parseDbName(dbname, conf); ++ GetTableRequest getTableRequest = new GetTableRequest(parsedDbName[DB_NAME],name); ++ getTableRequest.setCatName(parsedDbName[CAT_NAME]); ++ return getTableInternal(getTableRequest); ++ } ++ + @Override + public GetTableResult get_table_req(GetTableRequest req) throws MetaException, + NoSuchObjectException { +@@ -3774,6 +3784,14 @@ public class HMSHandler extends FacebookBase implements IHMSHandler { + * @throws UnknownDBException + */ + ++ @Override ++ @Deprecated ++ public List
get_table_objects_by_name(final String dbName, final List tableNames) ++ throws MetaException, InvalidOperationException, UnknownDBException { ++ String[] parsedDbName = parseDbName(dbName, conf); ++ return getTableObjectsInternal(parsedDbName[CAT_NAME], parsedDbName[DB_NAME], tableNames, null, null, null); ++ } ++ + @Override + public GetTablesResult get_table_objects_by_name_req(GetTablesRequest req) throws TException { + String catName = req.isSetCatName() ? req.getCatName() : getDefaultCatalog(conf); diff --git a/hive/stackable/patches/4.0.1/patchable.toml b/hive/stackable/patches/4.2.1/patchable.toml similarity index 51% rename from hive/stackable/patches/4.0.1/patchable.toml rename to hive/stackable/patches/4.2.1/patchable.toml index 807793caf..a6aa116bd 100644 --- a/hive/stackable/patches/4.0.1/patchable.toml +++ b/hive/stackable/patches/4.2.1/patchable.toml @@ -1,2 +1,2 @@ -base = "3af4517eb8cfd9407ad34ed78a0b48b57dfaa264" mirror = "https://github.com/stackabletech/hive.git" +base = "5399e73aade192795d867ae6be9c6423068024f6"