impala 0.1.6 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +0 -2
- data/impala.gemspec +1 -2
- data/lib/impala.rb +1 -1
- data/lib/impala/cursor.rb +10 -4
- data/lib/impala/protocol/beeswax_constants.rb +2 -1
- data/lib/impala/protocol/beeswax_service.rb +46 -46
- data/lib/impala/protocol/beeswax_types.rb +31 -30
- data/lib/impala/protocol/cli_service_constants.rb +60 -0
- data/lib/impala/protocol/cli_service_types.rb +1452 -0
- data/lib/impala/protocol/facebook_service.rb +17 -17
- data/lib/impala/protocol/fb303_constants.rb +2 -1
- data/lib/impala/protocol/fb303_types.rb +3 -2
- data/lib/impala/protocol/hive_metastore_constants.rb +2 -1
- data/lib/impala/protocol/hive_metastore_types.rb +102 -101
- data/lib/impala/protocol/impala_hive_server2_service.rb +29 -0
- data/lib/impala/protocol/impala_service.rb +135 -18
- data/lib/impala/protocol/impala_service_constants.rb +2 -1
- data/lib/impala/protocol/impala_service_types.rb +54 -10
- data/lib/impala/protocol/status_constants.rb +2 -1
- data/lib/impala/protocol/status_types.rb +9 -7
- data/lib/impala/protocol/t_c_l_i_service.rb +948 -0
- data/lib/impala/protocol/thrift_hive_metastore.rb +507 -507
- data/lib/impala/version.rb +1 -1
- data/test/test_impala_connected.rb +93 -13
- data/thrift/ImpalaService.thrift +78 -6
- data/thrift/Status.thrift +2 -1
- data/thrift/beeswax.thrift +1 -1
- data/thrift/cli_service.thrift +1015 -0
- metadata +9 -75
- data/lib/impala/protocol/data_constants.rb +0 -12
- data/lib/impala/protocol/data_sinks_constants.rb +0 -12
- data/lib/impala/protocol/data_sinks_types.rb +0 -107
- data/lib/impala/protocol/data_types.rb +0 -77
- data/lib/impala/protocol/descriptors_constants.rb +0 -12
- data/lib/impala/protocol/descriptors_types.rb +0 -266
- data/lib/impala/protocol/exprs_constants.rb +0 -12
- data/lib/impala/protocol/exprs_types.rb +0 -345
- data/lib/impala/protocol/frontend_constants.rb +0 -12
- data/lib/impala/protocol/frontend_types.rb +0 -347
- data/lib/impala/protocol/impala_internal_service.rb +0 -244
- data/lib/impala/protocol/impala_internal_service_constants.rb +0 -12
- data/lib/impala/protocol/impala_internal_service_types.rb +0 -362
- data/lib/impala/protocol/impala_plan_service.rb +0 -310
- data/lib/impala/protocol/impala_plan_service_constants.rb +0 -12
- data/lib/impala/protocol/impala_plan_service_types.rb +0 -36
- data/lib/impala/protocol/java_constants_constants.rb +0 -42
- data/lib/impala/protocol/java_constants_types.rb +0 -14
- data/lib/impala/protocol/opcodes_constants.rb +0 -12
- data/lib/impala/protocol/opcodes_types.rb +0 -309
- data/lib/impala/protocol/partitions_constants.rb +0 -12
- data/lib/impala/protocol/partitions_types.rb +0 -44
- data/lib/impala/protocol/plan_nodes_constants.rb +0 -12
- data/lib/impala/protocol/plan_nodes_types.rb +0 -345
- data/lib/impala/protocol/planner_constants.rb +0 -12
- data/lib/impala/protocol/planner_types.rb +0 -78
- data/lib/impala/protocol/runtime_profile_constants.rb +0 -12
- data/lib/impala/protocol/runtime_profile_types.rb +0 -97
- data/lib/impala/protocol/state_store_service.rb +0 -244
- data/lib/impala/protocol/state_store_service_constants.rb +0 -12
- data/lib/impala/protocol/state_store_service_types.rb +0 -185
- data/lib/impala/protocol/state_store_subscriber_service.rb +0 -82
- data/lib/impala/protocol/state_store_subscriber_service_constants.rb +0 -12
- data/lib/impala/protocol/state_store_subscriber_service_types.rb +0 -67
- data/lib/impala/protocol/statestore_types_constants.rb +0 -12
- data/lib/impala/protocol/statestore_types_types.rb +0 -77
- data/lib/impala/protocol/types_constants.rb +0 -12
- data/lib/impala/protocol/types_types.rb +0 -86
- data/thrift/Data.thrift +0 -52
- data/thrift/DataSinks.thrift +0 -61
- data/thrift/Descriptors.thrift +0 -115
- data/thrift/Exprs.thrift +0 -134
- data/thrift/Frontend.thrift +0 -193
- data/thrift/ImpalaInternalService.thrift +0 -265
- data/thrift/ImpalaPlanService.thrift +0 -44
- data/thrift/JavaConstants.thrift +0 -60
- data/thrift/Opcodes.thrift +0 -317
- data/thrift/Partitions.thrift +0 -41
- data/thrift/PlanNodes.thrift +0 -184
- data/thrift/Planner.thrift +0 -72
- data/thrift/RuntimeProfile.thrift +0 -58
- data/thrift/StateStoreService.thrift +0 -121
- data/thrift/StateStoreSubscriberService.thrift +0 -64
- data/thrift/StatestoreTypes.thrift +0 -50
- data/thrift/Types.thrift +0 -71
data/lib/impala/version.rb
CHANGED
|
@@ -16,17 +16,21 @@ def connect
|
|
|
16
16
|
Impala.connect(host, port)
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
describe 'connected tests' do
|
|
19
|
+
describe 'basic connected tests' do
|
|
20
20
|
before do
|
|
21
21
|
skip unless IMPALA_SERVER
|
|
22
22
|
@connection = connect
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
it 'can
|
|
25
|
+
it 'can connect' do
|
|
26
26
|
assert_instance_of(Impala::Connection, @connection)
|
|
27
27
|
assert(@connection.open?, "the connection should be open")
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
+
it 'can refresh the catalog' do
|
|
31
|
+
@connection.refresh
|
|
32
|
+
end
|
|
33
|
+
|
|
30
34
|
it 'can run a basic query' do
|
|
31
35
|
ret = @connection.query('SELECT "foo" AS foo')
|
|
32
36
|
assert_equal([{:foo=>'foo'}], ret, "the result should be a list of hashes")
|
|
@@ -55,21 +59,97 @@ describe 'connected tests' do
|
|
|
55
59
|
it 'can successfully refresh the metadata store' do
|
|
56
60
|
ret = @connection.refresh
|
|
57
61
|
end
|
|
62
|
+
end
|
|
58
63
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
+
describe 'with a test database' do
|
|
65
|
+
before do
|
|
66
|
+
@database = '_impala_ruby_test'
|
|
67
|
+
@connection.query("CREATE DATABASE IF NOT EXISTS #{@database}")
|
|
68
|
+
end
|
|
64
69
|
|
|
65
|
-
|
|
66
|
-
|
|
70
|
+
after do
|
|
71
|
+
@connection.query('DROP DATABASE IF EXISTS _impala_ruby_test')
|
|
72
|
+
end
|
|
67
73
|
|
|
68
|
-
|
|
69
|
-
|
|
74
|
+
it 'can use the database' do
|
|
75
|
+
@connection.query("USE #{@database}")
|
|
76
|
+
@connection.query("USE default")
|
|
70
77
|
end
|
|
71
78
|
|
|
72
|
-
|
|
73
|
-
|
|
79
|
+
describe 'and a test table' do
|
|
80
|
+
before do
|
|
81
|
+
@table = "#{@database}.foobar"
|
|
82
|
+
@connection.query("CREATE TABLE #{@table} (i INT)")
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
after do
|
|
86
|
+
@connection.query("DROP TABLE #{@table}")
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it 'deals with empty tables correctly when using #query' do
|
|
90
|
+
res = @connection.query("SELECT * FROM #{@table}")
|
|
91
|
+
assert_equal([], res, "the result set should be empty")
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it 'deals with empty tables correctly when using a cursor' do
|
|
95
|
+
cursor = @connection.execute("SELECT * FROM #{@table}")
|
|
96
|
+
assert_equal(false, cursor.has_more?, "has_more? should be false")
|
|
97
|
+
assert_nil(cursor.fetch_row, "calls to fetch_row should be nil")
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
describe 'with data' do
|
|
101
|
+
before do
|
|
102
|
+
@connection.query("INSERT INTO #{@table} (i) SELECT 1")
|
|
103
|
+
@connection.query("INSERT INTO #{@table} (i) SELECT 1")
|
|
104
|
+
@connection.query("INSERT INTO #{@table} (i) SELECT 1")
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it 'can insert into the table' do
|
|
108
|
+
@connection.query("INSERT INTO #{@table} (i) SELECT 2")
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
it 'can select from the table using #query' do
|
|
112
|
+
res = @connection.query("SELECT * FROM #{@table}")
|
|
113
|
+
assert_equal([{:i => 1}, {:i => 1}, {:i => 1}], res)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it 'can create a cursor and fetch one row at a time' do
|
|
117
|
+
cursor = @connection.execute("SELECT * FROM #{@table}")
|
|
118
|
+
assert_instance_of(Impala::Cursor, cursor, "the result should be a cursor")
|
|
119
|
+
|
|
120
|
+
3.times do
|
|
121
|
+
row = cursor.fetch_row
|
|
122
|
+
assert_equal({:i=>1}, row, "the row should be a hash with the correct result")
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
assert_equal(false, cursor.has_more?, "has_more? should be false")
|
|
126
|
+
assert_nil(cursor.fetch_row, "subsequent calls to fetch_row should be nil")
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it 'can use a cursor to deal with lots of data' do
|
|
130
|
+
10.times { @connection.query("INSERT INTO #{@table} SELECT * FROM #{@table}") }
|
|
131
|
+
@connection.query("INSERT INTO #{@table} (i) SELECT 1")
|
|
132
|
+
count = @connection.query("SELECT COUNT(*) as n from #{@table}")[0][:n]
|
|
133
|
+
assert(count > Impala::Cursor::BUFFER_SIZE) # otherwise the test is pointless
|
|
134
|
+
|
|
135
|
+
cursor = @connection.execute("SELECT * FROM #{@table}")
|
|
136
|
+
assert_instance_of(Impala::Cursor, cursor, "the result should be a cursor")
|
|
137
|
+
|
|
138
|
+
# fetch one to fill the buffer
|
|
139
|
+
row = cursor.fetch_row
|
|
140
|
+
assert_equal({:i=>1}, row, "the row should be a hash with the correct result")
|
|
141
|
+
|
|
142
|
+
buffer_size = cursor.instance_variable_get('@row_buffer').size
|
|
143
|
+
assert_equal(Impala::Cursor::BUFFER_SIZE - 1, buffer_size, "it should only buffer #{Impala::Cursor::BUFFER_SIZE} rows into memory")
|
|
144
|
+
|
|
145
|
+
(count - 1).times do
|
|
146
|
+
row = cursor.fetch_row
|
|
147
|
+
assert_equal({:i=>1}, row, "the row should be a hash with the correct result")
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
assert_equal(false, cursor.has_more?, "has_more? should be false")
|
|
151
|
+
assert_nil(cursor.fetch_row, "subsequent calls to fetch_row should be nil")
|
|
152
|
+
end
|
|
153
|
+
end
|
|
74
154
|
end
|
|
75
155
|
end
|
data/thrift/ImpalaService.thrift
CHANGED
|
@@ -14,21 +14,21 @@
|
|
|
14
14
|
|
|
15
15
|
namespace cpp impala
|
|
16
16
|
namespace java com.cloudera.impala.thrift
|
|
17
|
-
namespace rb
|
|
17
|
+
namespace rb impala.protocol
|
|
18
18
|
|
|
19
19
|
include "Status.thrift"
|
|
20
20
|
include "beeswax.thrift"
|
|
21
|
+
include "cli_service.thrift"
|
|
21
22
|
|
|
22
23
|
// ImpalaService accepts query execution options through beeswax.Query.configuration in
|
|
23
24
|
// key:value form. For example, the list of strings could be:
|
|
24
25
|
// "num_nodes:1", "abort_on_error:false"
|
|
25
26
|
// The valid keys are listed in this enum. They map to TQueryOptions.
|
|
26
27
|
// Note: If you add an option or change the default, you also need to update:
|
|
27
|
-
// - JavaConstants.DEFAULT_QUERY_OPTIONS
|
|
28
28
|
// - ImpalaInternalService.thrift: TQueryOptions
|
|
29
29
|
// - ImpaladClientExecutor.getBeeswaxQueryConfigurations()
|
|
30
|
-
// - ImpalaServer::
|
|
31
|
-
// - ImpalaServer::
|
|
30
|
+
// - ImpalaServer::SetQueryOptions()
|
|
31
|
+
// - ImpalaServer::TQueryOptionsToMap()
|
|
32
32
|
enum TImpalaQueryOptions {
|
|
33
33
|
// if true, abort execution on the first error
|
|
34
34
|
ABORT_ON_ERROR,
|
|
@@ -43,6 +43,13 @@ enum TImpalaQueryOptions {
|
|
|
43
43
|
// default
|
|
44
44
|
BATCH_SIZE,
|
|
45
45
|
|
|
46
|
+
// a per-machine approximate limit on the memory consumption of this query;
|
|
47
|
+
// unspecified or a limit of 0 means no limit;
|
|
48
|
+
// otherwise specified either as:
|
|
49
|
+
// a) an int (= number of bytes);
|
|
50
|
+
// b) a float followed by "M" (MB) or "G" (GB)
|
|
51
|
+
MEM_LIMIT,
|
|
52
|
+
|
|
46
53
|
// specifies the degree of parallelism with which to execute the query;
|
|
47
54
|
// 1: single-node execution
|
|
48
55
|
// NUM_NODES_ALL: executes on all nodes that contain relevant data
|
|
@@ -70,6 +77,41 @@ enum TImpalaQueryOptions {
|
|
|
70
77
|
// with an ORDER BY but without a LIMIT clause (ie, if the SELECT statement also has
|
|
71
78
|
// a LIMIT clause, this default is ignored)
|
|
72
79
|
DEFAULT_ORDER_BY_LIMIT,
|
|
80
|
+
|
|
81
|
+
// DEBUG ONLY:
|
|
82
|
+
// If set to
|
|
83
|
+
// "[<backend number>:]<node id>:<TExecNodePhase>:<TDebugAction>",
|
|
84
|
+
// the exec node with the given id will perform the specified action in the given
|
|
85
|
+
// phase. If the optional backend number (starting from 0) is specified, only that
|
|
86
|
+
// backend instance will perform the debug action, otherwise all backends will behave
|
|
87
|
+
// in that way.
|
|
88
|
+
// If the string doesn't have the required format or if any of its components is
|
|
89
|
+
// invalid, the option is ignored.
|
|
90
|
+
DEBUG_ACTION,
|
|
91
|
+
|
|
92
|
+
// If true, raise an error when the DEFAULT_ORDER_BY_LIMIT has been reached.
|
|
93
|
+
ABORT_ON_DEFAULT_LIMIT_EXCEEDED,
|
|
94
|
+
|
|
95
|
+
// Compression codec for parquet when inserting into parquet tables.
|
|
96
|
+
// Valid values are "snappy", "gzip" and "none"
|
|
97
|
+
// Leave blank to use default.
|
|
98
|
+
PARQUET_COMPRESSION_CODEC,
|
|
99
|
+
|
|
100
|
+
// HBase scan query option. If set and > 0, HBASE_CACHING is the value for
|
|
101
|
+
// "hbase.client.Scan.setCaching()" when querying HBase table. Otherwise, use backend
|
|
102
|
+
// default.
|
|
103
|
+
// If the value is too high, then the hbase region server will have a hard time (GC
|
|
104
|
+
// pressure and long response times). If the value is too small, then there will be
|
|
105
|
+
// extra trips to the hbase region server.
|
|
106
|
+
HBASE_CACHING,
|
|
107
|
+
|
|
108
|
+
// HBase scan query option. If set, HBase scan will always set
|
|
109
|
+
// "hbase.client.setCacheBlocks" to CACHE_BLOCKS. Default is false.
|
|
110
|
+
// If the table is large and the query is doing big scan, set it to false to
|
|
111
|
+
// avoid polluting the cache in the hbase region server.
|
|
112
|
+
// If the table is small and the table is used several time, set it to true to improve
|
|
113
|
+
// performance.
|
|
114
|
+
HBASE_CACHE_BLOCKS,
|
|
73
115
|
}
|
|
74
116
|
|
|
75
117
|
// The summary of an insert.
|
|
@@ -80,6 +122,22 @@ struct TInsertResult {
|
|
|
80
122
|
1: required map<string, i64> rows_appended
|
|
81
123
|
}
|
|
82
124
|
|
|
125
|
+
// Response from a call to PingImpalaService
|
|
126
|
+
struct TPingImpalaServiceResp {
|
|
127
|
+
// The Impala service's version string.
|
|
128
|
+
1: string version
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Parameters for a ResetTable request which will invalidate a table's metadata.
|
|
132
|
+
// DEPRECATED.
|
|
133
|
+
struct TResetTableReq {
|
|
134
|
+
// Name of the table's parent database.
|
|
135
|
+
1: required string db_name
|
|
136
|
+
|
|
137
|
+
// Name of the table.
|
|
138
|
+
2: required string table_name
|
|
139
|
+
}
|
|
140
|
+
|
|
83
141
|
// For all rpc that return a TStatus as part of their result type,
|
|
84
142
|
// if the status_code field is set to anything other than OK, the contents
|
|
85
143
|
// of the remainder of the result type is undefined (typically not set)
|
|
@@ -94,12 +152,26 @@ service ImpalaService extends beeswax.BeeswaxService {
|
|
|
94
152
|
throws(1:beeswax.BeeswaxException error);
|
|
95
153
|
|
|
96
154
|
// Invalidates all catalog metadata, forcing a reload
|
|
155
|
+
// DEPRECATED; execute query "invalidate metadata" to refresh metadata
|
|
97
156
|
Status.TStatus ResetCatalog();
|
|
98
157
|
|
|
158
|
+
// Invalidates a specific table's catalog metadata, forcing a reload on the next access
|
|
159
|
+
// DEPRECATED; execute query "refresh <table>" to refresh metadata
|
|
160
|
+
Status.TStatus ResetTable(1:TResetTableReq request)
|
|
161
|
+
|
|
162
|
+
// Returns the runtime profile string for the given query handle.
|
|
163
|
+
string GetRuntimeProfile(1:beeswax.QueryHandle query_id)
|
|
164
|
+
throws(1:beeswax.BeeswaxException error);
|
|
165
|
+
|
|
99
166
|
// Closes the query handle and return the result summary of the insert.
|
|
100
167
|
TInsertResult CloseInsert(1:beeswax.QueryHandle handle)
|
|
101
168
|
throws(1:beeswax.QueryNotFoundException error, 2:beeswax.BeeswaxException error2);
|
|
102
169
|
|
|
103
|
-
// Client calls this RPC to verify that the server is an ImpalaService.
|
|
104
|
-
|
|
170
|
+
// Client calls this RPC to verify that the server is an ImpalaService. Returns the
|
|
171
|
+
// server version.
|
|
172
|
+
TPingImpalaServiceResp PingImpalaService();
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Impala HiveServer2 service
|
|
176
|
+
service ImpalaHiveServer2Service extends cli_service.TCLIService {
|
|
105
177
|
}
|
data/thrift/Status.thrift
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
namespace cpp impala
|
|
16
16
|
namespace java com.cloudera.impala.thrift
|
|
17
|
-
namespace rb
|
|
17
|
+
namespace rb impala.protocol
|
|
18
18
|
|
|
19
19
|
enum TStatusCode {
|
|
20
20
|
OK,
|
|
@@ -22,6 +22,7 @@ enum TStatusCode {
|
|
|
22
22
|
ANALYSIS_ERROR,
|
|
23
23
|
NOT_IMPLEMENTED_ERROR,
|
|
24
24
|
RUNTIME_ERROR,
|
|
25
|
+
MEM_LIMIT_EXCEEDED,
|
|
25
26
|
INTERNAL_ERROR
|
|
26
27
|
}
|
|
27
28
|
|
data/thrift/beeswax.thrift
CHANGED
|
@@ -0,0 +1,1015 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
// See the License for the specific language governing permissions and
|
|
15
|
+
// limitations under the License.
|
|
16
|
+
|
|
17
|
+
// Coding Conventions for this file:
|
|
18
|
+
//
|
|
19
|
+
// Structs/Enums/Unions
|
|
20
|
+
// * Struct, Enum, and Union names begin with a "T",
|
|
21
|
+
// and use a capital letter for each new word, with no underscores.
|
|
22
|
+
// * All fields should be declared as either optional or required.
|
|
23
|
+
//
|
|
24
|
+
// Functions
|
|
25
|
+
// * Function names start with a capital letter and have a capital letter for
|
|
26
|
+
// each new word, with no underscores.
|
|
27
|
+
// * Each function should take exactly one parameter, named TFunctionNameReq,
|
|
28
|
+
// and should return either void or TFunctionNameResp. This convention allows
|
|
29
|
+
// incremental updates.
|
|
30
|
+
//
|
|
31
|
+
// Services
|
|
32
|
+
// * Service names begin with the letter "T", use a capital letter for each
|
|
33
|
+
// new word (with no underscores), and end with the word "Service".
|
|
34
|
+
|
|
35
|
+
namespace java org.apache.hive.service.cli.thrift
|
|
36
|
+
namespace cpp apache.hive.service.cli.thrift
|
|
37
|
+
namespace rb impala.protocol.hive
|
|
38
|
+
|
|
39
|
+
// List of protocol versions. A new token should be
|
|
40
|
+
// added to the end of this list every time a change is made.
|
|
41
|
+
enum TProtocolVersion {
|
|
42
|
+
HIVE_CLI_SERVICE_PROTOCOL_V1
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
enum TTypeId {
|
|
46
|
+
BOOLEAN_TYPE,
|
|
47
|
+
TINYINT_TYPE,
|
|
48
|
+
SMALLINT_TYPE,
|
|
49
|
+
INT_TYPE,
|
|
50
|
+
BIGINT_TYPE,
|
|
51
|
+
FLOAT_TYPE,
|
|
52
|
+
DOUBLE_TYPE,
|
|
53
|
+
STRING_TYPE,
|
|
54
|
+
TIMESTAMP_TYPE,
|
|
55
|
+
BINARY_TYPE,
|
|
56
|
+
ARRAY_TYPE,
|
|
57
|
+
MAP_TYPE,
|
|
58
|
+
STRUCT_TYPE,
|
|
59
|
+
UNION_TYPE,
|
|
60
|
+
USER_DEFINED_TYPE,
|
|
61
|
+
DECIMAL_TYPE
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const set<TTypeId> PRIMITIVE_TYPES = [
|
|
65
|
+
TTypeId.BOOLEAN_TYPE
|
|
66
|
+
TTypeId.TINYINT_TYPE
|
|
67
|
+
TTypeId.SMALLINT_TYPE
|
|
68
|
+
TTypeId.INT_TYPE
|
|
69
|
+
TTypeId.BIGINT_TYPE
|
|
70
|
+
TTypeId.FLOAT_TYPE
|
|
71
|
+
TTypeId.DOUBLE_TYPE
|
|
72
|
+
TTypeId.STRING_TYPE
|
|
73
|
+
TTypeId.TIMESTAMP_TYPE
|
|
74
|
+
TTypeId.BINARY_TYPE,
|
|
75
|
+
TTypeId.DECIMAL_TYPE
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
const set<TTypeId> COMPLEX_TYPES = [
|
|
79
|
+
TTypeId.ARRAY_TYPE
|
|
80
|
+
TTypeId.MAP_TYPE
|
|
81
|
+
TTypeId.STRUCT_TYPE
|
|
82
|
+
TTypeId.UNION_TYPE
|
|
83
|
+
TTypeId.USER_DEFINED_TYPE
|
|
84
|
+
]
|
|
85
|
+
|
|
86
|
+
const set<TTypeId> COLLECTION_TYPES = [
|
|
87
|
+
TTypeId.ARRAY_TYPE
|
|
88
|
+
TTypeId.MAP_TYPE
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
const map<TTypeId,string> TYPE_NAMES = {
|
|
92
|
+
TTypeId.BOOLEAN_TYPE: "BOOLEAN",
|
|
93
|
+
TTypeId.TINYINT_TYPE: "TINYINT",
|
|
94
|
+
TTypeId.SMALLINT_TYPE: "SMALLINT",
|
|
95
|
+
TTypeId.INT_TYPE: "INT",
|
|
96
|
+
TTypeId.BIGINT_TYPE: "BIGINT",
|
|
97
|
+
TTypeId.FLOAT_TYPE: "FLOAT",
|
|
98
|
+
TTypeId.DOUBLE_TYPE: "DOUBLE",
|
|
99
|
+
TTypeId.STRING_TYPE: "STRING",
|
|
100
|
+
TTypeId.TIMESTAMP_TYPE: "TIMESTAMP",
|
|
101
|
+
TTypeId.BINARY_TYPE: "BINARY",
|
|
102
|
+
TTypeId.ARRAY_TYPE: "ARRAY",
|
|
103
|
+
TTypeId.MAP_TYPE: "MAP",
|
|
104
|
+
TTypeId.STRUCT_TYPE: "STRUCT",
|
|
105
|
+
TTypeId.UNION_TYPE: "UNIONTYPE"
|
|
106
|
+
TTypeId.DECIMAL_TYPE: "DECIMAL"
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Thrift does not support recursively defined types or forward declarations,
|
|
110
|
+
// which makes it difficult to represent Hive's nested types.
|
|
111
|
+
// To get around these limitations TTypeDesc employs a type list that maps
|
|
112
|
+
// integer "pointers" to TTypeEntry objects. The following examples show
|
|
113
|
+
// how different types are represented using this scheme:
|
|
114
|
+
//
|
|
115
|
+
// "INT":
|
|
116
|
+
// TTypeDesc {
|
|
117
|
+
// types = [
|
|
118
|
+
// TTypeEntry.primitive_entry {
|
|
119
|
+
// type = INT_TYPE
|
|
120
|
+
// }
|
|
121
|
+
// ]
|
|
122
|
+
// }
|
|
123
|
+
//
|
|
124
|
+
// "ARRAY<INT>":
|
|
125
|
+
// TTypeDesc {
|
|
126
|
+
// types = [
|
|
127
|
+
// TTypeEntry.array_entry {
|
|
128
|
+
// object_type_ptr = 1
|
|
129
|
+
// },
|
|
130
|
+
// TTypeEntry.primitive_entry {
|
|
131
|
+
// type = INT_TYPE
|
|
132
|
+
// }
|
|
133
|
+
// ]
|
|
134
|
+
// }
|
|
135
|
+
//
|
|
136
|
+
// "MAP<INT,STRING>":
|
|
137
|
+
// TTypeDesc {
|
|
138
|
+
// types = [
|
|
139
|
+
// TTypeEntry.map_entry {
|
|
140
|
+
// key_type_ptr = 1
|
|
141
|
+
// value_type_ptr = 2
|
|
142
|
+
// },
|
|
143
|
+
// TTypeEntry.primitive_entry {
|
|
144
|
+
// type = INT_TYPE
|
|
145
|
+
// },
|
|
146
|
+
// TTypeEntry.primitive_entry {
|
|
147
|
+
// type = STRING_TYPE
|
|
148
|
+
// }
|
|
149
|
+
// ]
|
|
150
|
+
// }
|
|
151
|
+
|
|
152
|
+
typedef i32 TTypeEntryPtr
|
|
153
|
+
|
|
154
|
+
// Type entry for a primitive type.
|
|
155
|
+
struct TPrimitiveTypeEntry {
|
|
156
|
+
// The primitive type token. This must satisfy the condition
|
|
157
|
+
// that type is in the PRIMITIVE_TYPES set.
|
|
158
|
+
1: required TTypeId type
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Type entry for an ARRAY type.
|
|
162
|
+
struct TArrayTypeEntry {
|
|
163
|
+
1: required TTypeEntryPtr objectTypePtr
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Type entry for a MAP type.
|
|
167
|
+
struct TMapTypeEntry {
|
|
168
|
+
1: required TTypeEntryPtr keyTypePtr
|
|
169
|
+
2: required TTypeEntryPtr valueTypePtr
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Type entry for a STRUCT type.
|
|
173
|
+
struct TStructTypeEntry {
|
|
174
|
+
1: required map<string, TTypeEntryPtr> nameToTypePtr
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Type entry for a UNIONTYPE type.
|
|
178
|
+
struct TUnionTypeEntry {
|
|
179
|
+
1: required map<string, TTypeEntryPtr> nameToTypePtr
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
struct TUserDefinedTypeEntry {
|
|
183
|
+
// The fully qualified name of the class implementing this type.
|
|
184
|
+
1: required string typeClassName
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// We use a union here since Thrift does not support inheritance.
|
|
188
|
+
union TTypeEntry {
|
|
189
|
+
1: TPrimitiveTypeEntry primitiveEntry
|
|
190
|
+
2: TArrayTypeEntry arrayEntry
|
|
191
|
+
3: TMapTypeEntry mapEntry
|
|
192
|
+
4: TStructTypeEntry structEntry
|
|
193
|
+
5: TUnionTypeEntry unionEntry
|
|
194
|
+
6: TUserDefinedTypeEntry userDefinedTypeEntry
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Type descriptor for columns.
|
|
198
|
+
struct TTypeDesc {
|
|
199
|
+
// The "top" type is always the first element of the list.
|
|
200
|
+
// If the top type is an ARRAY, MAP, STRUCT, or UNIONTYPE
|
|
201
|
+
// type, then subsequent elements represent nested types.
|
|
202
|
+
1: required list<TTypeEntry> types
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// A result set column descriptor.
|
|
206
|
+
struct TColumnDesc {
|
|
207
|
+
// The name of the column
|
|
208
|
+
1: required string columnName
|
|
209
|
+
|
|
210
|
+
// The type descriptor for this column
|
|
211
|
+
2: required TTypeDesc typeDesc
|
|
212
|
+
|
|
213
|
+
// The ordinal position of this column in the schema
|
|
214
|
+
3: required i32 position
|
|
215
|
+
|
|
216
|
+
4: optional string comment
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Metadata used to describe the schema (column names, types, comments)
|
|
220
|
+
// of result sets.
|
|
221
|
+
struct TTableSchema {
|
|
222
|
+
1: required list<TColumnDesc> columns
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// A Boolean column value.
|
|
226
|
+
struct TBoolValue {
|
|
227
|
+
// NULL if value is unset.
|
|
228
|
+
1: optional bool value
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// A Byte column value.
|
|
232
|
+
struct TByteValue {
|
|
233
|
+
// NULL if value is unset.
|
|
234
|
+
1: optional byte value
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// A signed, 16 bit column value.
|
|
238
|
+
struct TI16Value {
|
|
239
|
+
// NULL if value is unset
|
|
240
|
+
1: optional i16 value
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// A signed, 32 bit column value
|
|
244
|
+
struct TI32Value {
|
|
245
|
+
// NULL if value is unset
|
|
246
|
+
1: optional i32 value
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// A signed 64 bit column value
|
|
250
|
+
struct TI64Value {
|
|
251
|
+
// NULL if value is unset
|
|
252
|
+
1: optional i64 value
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// A floating point 64 bit column value
|
|
256
|
+
struct TDoubleValue {
|
|
257
|
+
// NULL if value is unset
|
|
258
|
+
1: optional double value
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
struct TStringValue {
|
|
262
|
+
// NULL if value is unset
|
|
263
|
+
1: optional string value
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
union TColumn {
|
|
267
|
+
1: list<TBoolValue> boolColumn
|
|
268
|
+
2: list<TByteValue> byteColumn
|
|
269
|
+
3: list<TI16Value> i16Column
|
|
270
|
+
4: list<TI32Value> i32Column
|
|
271
|
+
5: list<TI64Value> i64Column
|
|
272
|
+
6: list<TDoubleValue> doubleColumn
|
|
273
|
+
7: list<TStringValue> stringColumn
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// A single column value in a result set.
|
|
277
|
+
// Note that Hive's type system is richer than Thrift's,
|
|
278
|
+
// so in some cases we have to map multiple Hive types
|
|
279
|
+
// to the same Thrift type. On the client-side this is
|
|
280
|
+
// disambiguated by looking at the Schema of the
|
|
281
|
+
// result set.
|
|
282
|
+
union TColumnValue {
|
|
283
|
+
1: TBoolValue boolVal // BOOLEAN
|
|
284
|
+
2: TByteValue byteVal // TINYINT
|
|
285
|
+
3: TI16Value i16Val // SMALLINT
|
|
286
|
+
4: TI32Value i32Val // INT
|
|
287
|
+
5: TI64Value i64Val // BIGINT, TIMESTAMP
|
|
288
|
+
6: TDoubleValue doubleVal // FLOAT, DOUBLE
|
|
289
|
+
7: TStringValue stringVal // STRING, LIST, MAP, STRUCT, UNIONTYPE, BINARY, DECIMAL
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Represents a row in a rowset.
|
|
293
|
+
struct TRow {
|
|
294
|
+
1: required list<TColumnValue> colVals
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Represents a rowset
|
|
298
|
+
struct TRowSet {
|
|
299
|
+
// The starting row offset of this rowset.
|
|
300
|
+
1: required i64 startRowOffset
|
|
301
|
+
2: required list<TRow> rows
|
|
302
|
+
3: optional list<TColumn> columns
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// The return status code contained in each response.
|
|
306
|
+
enum TStatusCode {
|
|
307
|
+
SUCCESS_STATUS,
|
|
308
|
+
SUCCESS_WITH_INFO_STATUS,
|
|
309
|
+
STILL_EXECUTING_STATUS,
|
|
310
|
+
ERROR_STATUS,
|
|
311
|
+
INVALID_HANDLE_STATUS
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// The return status of a remote request
|
|
315
|
+
struct TStatus {
|
|
316
|
+
1: required TStatusCode statusCode
|
|
317
|
+
|
|
318
|
+
// If status is SUCCESS_WITH_INFO, info_msgs may be populated with
|
|
319
|
+
// additional diagnostic information.
|
|
320
|
+
2: optional list<string> infoMessages
|
|
321
|
+
|
|
322
|
+
// If status is ERROR, then the following fields may be set
|
|
323
|
+
3: optional string sqlState // as defined in the ISO/IEF CLI specification
|
|
324
|
+
4: optional i32 errorCode // internal error code
|
|
325
|
+
5: optional string errorMessage
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// The state of an operation (i.e. a query or other
|
|
329
|
+
// asynchronous operation that generates a result set)
|
|
330
|
+
// on the server.
|
|
331
|
+
enum TOperationState {
|
|
332
|
+
// The operation has been initialized
|
|
333
|
+
INITIALIZED_STATE,
|
|
334
|
+
|
|
335
|
+
// The operation is running. In this state the result
|
|
336
|
+
// set is not available.
|
|
337
|
+
RUNNING_STATE,
|
|
338
|
+
|
|
339
|
+
// The operation has completed. When an operation is in
|
|
340
|
+
// this state its result set may be fetched.
|
|
341
|
+
FINISHED_STATE,
|
|
342
|
+
|
|
343
|
+
// The operation was canceled by a client
|
|
344
|
+
CANCELED_STATE,
|
|
345
|
+
|
|
346
|
+
// The operation was closed by a client
|
|
347
|
+
CLOSED_STATE,
|
|
348
|
+
|
|
349
|
+
// The operation failed due to an error
|
|
350
|
+
ERROR_STATE,
|
|
351
|
+
|
|
352
|
+
// The operation is in an unrecognized state
|
|
353
|
+
UKNOWN_STATE,
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
// A string identifier. This is interpreted literally.
|
|
358
|
+
typedef string TIdentifier
|
|
359
|
+
|
|
360
|
+
// A search pattern.
|
|
361
|
+
//
|
|
362
|
+
// Valid search pattern characters:
|
|
363
|
+
// '_': Any single character.
|
|
364
|
+
// '%': Any sequence of zero or more characters.
|
|
365
|
+
// '\': Escape character used to include special characters,
|
|
366
|
+
// e.g. '_', '%', '\'. If a '\' precedes a non-special
|
|
367
|
+
// character it has no special meaning and is interpreted
|
|
368
|
+
// literally.
|
|
369
|
+
typedef string TPattern
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
// A search pattern or identifier. Used as input
|
|
373
|
+
// parameter for many of the catalog functions.
|
|
374
|
+
typedef string TPatternOrIdentifier
|
|
375
|
+
|
|
376
|
+
struct THandleIdentifier {
|
|
377
|
+
// 16 byte globally unique identifier
|
|
378
|
+
// This is the public ID of the handle and
|
|
379
|
+
// can be used for reporting.
|
|
380
|
+
1: required binary guid,
|
|
381
|
+
|
|
382
|
+
// 16 byte secret generated by the server
|
|
383
|
+
// and used to verify that the handle is not
|
|
384
|
+
// being hijacked by another user.
|
|
385
|
+
2: required binary secret,
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
// Client-side handle to persistent
|
|
389
|
+
// session information on the server-side.
|
|
390
|
+
struct TSessionHandle {
|
|
391
|
+
1: required THandleIdentifier sessionId
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// The subtype of an OperationHandle.
|
|
395
|
+
enum TOperationType {
|
|
396
|
+
EXECUTE_STATEMENT,
|
|
397
|
+
GET_TYPE_INFO,
|
|
398
|
+
GET_CATALOGS,
|
|
399
|
+
GET_SCHEMAS,
|
|
400
|
+
GET_TABLES,
|
|
401
|
+
GET_TABLE_TYPES,
|
|
402
|
+
GET_COLUMNS,
|
|
403
|
+
GET_FUNCTIONS,
|
|
404
|
+
UNKNOWN,
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// Client-side reference to a task running
|
|
408
|
+
// asynchronously on the server.
|
|
409
|
+
struct TOperationHandle {
|
|
410
|
+
1: required THandleIdentifier operationId
|
|
411
|
+
2: required TOperationType operationType
|
|
412
|
+
|
|
413
|
+
// If hasResultSet = TRUE, then this operation
|
|
414
|
+
// generates a result set that can be fetched.
|
|
415
|
+
// Note that the result set may be empty.
|
|
416
|
+
//
|
|
417
|
+
// If hasResultSet = FALSE, then this operation
|
|
418
|
+
// does not generate a result set, and calling
|
|
419
|
+
// GetResultSetMetadata or FetchResults against
|
|
420
|
+
// this OperationHandle will generate an error.
|
|
421
|
+
3: required bool hasResultSet
|
|
422
|
+
|
|
423
|
+
// For operations that don't generate result sets,
|
|
424
|
+
// modifiedRowCount is either:
|
|
425
|
+
//
|
|
426
|
+
// 1) The number of rows that were modified by
|
|
427
|
+
// the DML operation (e.g. number of rows inserted,
|
|
428
|
+
// number of rows deleted, etc).
|
|
429
|
+
//
|
|
430
|
+
// 2) 0 for operations that don't modify or add rows.
|
|
431
|
+
//
|
|
432
|
+
// 3) < 0 if the operation is capable of modifiying rows,
|
|
433
|
+
// but Hive is unable to determine how many rows were
|
|
434
|
+
// modified. For example, Hive's LOAD DATA command
|
|
435
|
+
// doesn't generate row count information because
|
|
436
|
+
// Hive doesn't inspect the data as it is loaded.
|
|
437
|
+
//
|
|
438
|
+
// modifiedRowCount is unset if the operation generates
|
|
439
|
+
// a result set.
|
|
440
|
+
4: optional double modifiedRowCount
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
// OpenSession()
|
|
445
|
+
//
|
|
446
|
+
// Open a session (connection) on the server against
|
|
447
|
+
// which operations may be executed.
|
|
448
|
+
struct TOpenSessionReq {
|
|
449
|
+
// The version of the HiveServer2 protocol that the client is using.
|
|
450
|
+
1: required TProtocolVersion client_protocol = TProtocolVersion.HIVE_CLI_SERVICE_PROTOCOL_V1
|
|
451
|
+
|
|
452
|
+
// Username and password for authentication.
|
|
453
|
+
// Depending on the authentication scheme being used,
|
|
454
|
+
// this information may instead be provided by a lower
|
|
455
|
+
// protocol layer, in which case these fields may be
|
|
456
|
+
// left unset.
|
|
457
|
+
2: optional string username
|
|
458
|
+
3: optional string password
|
|
459
|
+
|
|
460
|
+
// Configuration overlay which is applied when the session is
|
|
461
|
+
// first created.
|
|
462
|
+
4: optional map<string, string> configuration
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
struct TOpenSessionResp {
|
|
466
|
+
1: required TStatus status
|
|
467
|
+
|
|
468
|
+
// The protocol version that the server is using.
|
|
469
|
+
2: required TProtocolVersion serverProtocolVersion = TProtocolVersion.HIVE_CLI_SERVICE_PROTOCOL_V1
|
|
470
|
+
|
|
471
|
+
// Session Handle
|
|
472
|
+
3: optional TSessionHandle sessionHandle
|
|
473
|
+
|
|
474
|
+
// The configuration settings for this session.
|
|
475
|
+
4: optional map<string, string> configuration
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
|
|
479
|
+
// CloseSession()
|
|
480
|
+
//
|
|
481
|
+
// Closes the specified session and frees any resources
|
|
482
|
+
// currently allocated to that session. Any open
|
|
483
|
+
// operations in that session will be canceled.
|
|
484
|
+
struct TCloseSessionReq {
|
|
485
|
+
1: required TSessionHandle sessionHandle
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
struct TCloseSessionResp {
|
|
489
|
+
1: required TStatus status
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
enum TGetInfoType {
|
|
495
|
+
CLI_MAX_DRIVER_CONNECTIONS = 0,
|
|
496
|
+
CLI_MAX_CONCURRENT_ACTIVITIES = 1,
|
|
497
|
+
CLI_DATA_SOURCE_NAME = 2,
|
|
498
|
+
CLI_FETCH_DIRECTION = 8,
|
|
499
|
+
CLI_SERVER_NAME = 13,
|
|
500
|
+
CLI_SEARCH_PATTERN_ESCAPE = 14,
|
|
501
|
+
CLI_DBMS_NAME = 17,
|
|
502
|
+
CLI_DBMS_VER = 18,
|
|
503
|
+
CLI_ACCESSIBLE_TABLES = 19,
|
|
504
|
+
CLI_ACCESSIBLE_PROCEDURES = 20,
|
|
505
|
+
CLI_CURSOR_COMMIT_BEHAVIOR = 23,
|
|
506
|
+
CLI_DATA_SOURCE_READ_ONLY = 25,
|
|
507
|
+
CLI_DEFAULT_TXN_ISOLATION = 26,
|
|
508
|
+
CLI_IDENTIFIER_CASE = 28,
|
|
509
|
+
CLI_IDENTIFIER_QUOTE_CHAR = 29,
|
|
510
|
+
CLI_MAX_COLUMN_NAME_LEN = 30,
|
|
511
|
+
CLI_MAX_CURSOR_NAME_LEN = 31,
|
|
512
|
+
CLI_MAX_SCHEMA_NAME_LEN = 32,
|
|
513
|
+
CLI_MAX_CATALOG_NAME_LEN = 34,
|
|
514
|
+
CLI_MAX_TABLE_NAME_LEN = 35,
|
|
515
|
+
CLI_SCROLL_CONCURRENCY = 43,
|
|
516
|
+
CLI_TXN_CAPABLE = 46,
|
|
517
|
+
CLI_USER_NAME = 47,
|
|
518
|
+
CLI_TXN_ISOLATION_OPTION = 72,
|
|
519
|
+
CLI_INTEGRITY = 73,
|
|
520
|
+
CLI_GETDATA_EXTENSIONS = 81,
|
|
521
|
+
CLI_NULL_COLLATION = 85,
|
|
522
|
+
CLI_ALTER_TABLE = 86,
|
|
523
|
+
CLI_ORDER_BY_COLUMNS_IN_SELECT = 90,
|
|
524
|
+
CLI_SPECIAL_CHARACTERS = 94,
|
|
525
|
+
CLI_MAX_COLUMNS_IN_GROUP_BY = 97,
|
|
526
|
+
CLI_MAX_COLUMNS_IN_INDEX = 98,
|
|
527
|
+
CLI_MAX_COLUMNS_IN_ORDER_BY = 99,
|
|
528
|
+
CLI_MAX_COLUMNS_IN_SELECT = 100,
|
|
529
|
+
CLI_MAX_COLUMNS_IN_TABLE = 101,
|
|
530
|
+
CLI_MAX_INDEX_SIZE = 102,
|
|
531
|
+
CLI_MAX_ROW_SIZE = 104,
|
|
532
|
+
CLI_MAX_STATEMENT_LEN = 105,
|
|
533
|
+
CLI_MAX_TABLES_IN_SELECT = 106,
|
|
534
|
+
CLI_MAX_USER_NAME_LEN = 107,
|
|
535
|
+
CLI_OJ_CAPABILITIES = 115,
|
|
536
|
+
|
|
537
|
+
CLI_XOPEN_CLI_YEAR = 10000,
|
|
538
|
+
CLI_CURSOR_SENSITIVITY = 10001,
|
|
539
|
+
CLI_DESCRIBE_PARAMETER = 10002,
|
|
540
|
+
CLI_CATALOG_NAME = 10003,
|
|
541
|
+
CLI_COLLATION_SEQ = 10004,
|
|
542
|
+
CLI_MAX_IDENTIFIER_LEN = 10005,
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
union TGetInfoValue {
|
|
546
|
+
1: string stringValue
|
|
547
|
+
2: i16 smallIntValue
|
|
548
|
+
3: i32 integerBitmask
|
|
549
|
+
4: i32 integerFlag
|
|
550
|
+
5: i32 binaryValue
|
|
551
|
+
6: i64 lenValue
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
// GetInfo()
|
|
555
|
+
//
|
|
556
|
+
// This function is based on ODBC's CLIGetInfo() function.
|
|
557
|
+
// The function returns general information about the data source
|
|
558
|
+
// using the same keys as ODBC.
|
|
559
|
+
struct TGetInfoReq {
|
|
560
|
+
// The sesssion to run this request against
|
|
561
|
+
1: required TSessionHandle sessionHandle
|
|
562
|
+
|
|
563
|
+
2: required TGetInfoType infoType
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
struct TGetInfoResp {
|
|
567
|
+
1: required TStatus status
|
|
568
|
+
|
|
569
|
+
2: required TGetInfoValue infoValue
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
|
|
573
|
+
// ExecuteStatement()
|
|
574
|
+
//
|
|
575
|
+
// Execute a statement.
|
|
576
|
+
// The returned OperationHandle can be used to check on the
|
|
577
|
+
// status of the statement, and to fetch results once the
|
|
578
|
+
// statement has finished executing.
|
|
579
|
+
struct TExecuteStatementReq {
|
|
580
|
+
// The session to exexcute the statement against
|
|
581
|
+
1: required TSessionHandle sessionHandle
|
|
582
|
+
|
|
583
|
+
// The statement to be executed (DML, DDL, SET, etc)
|
|
584
|
+
2: required string statement
|
|
585
|
+
|
|
586
|
+
// Configuration properties that are overlayed on top of the
|
|
587
|
+
// the existing session configuration before this statement
|
|
588
|
+
// is executed. These properties apply to this statement
|
|
589
|
+
// only and will not affect the subsequent state of the Session.
|
|
590
|
+
3: optional map<string, string> confOverlay
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
struct TExecuteStatementResp {
|
|
594
|
+
1: required TStatus status
|
|
595
|
+
2: optional TOperationHandle operationHandle
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
|
|
599
|
+
// GetTypeInfo()
|
|
600
|
+
//
|
|
601
|
+
// Get information about types supported by the HiveServer instance.
|
|
602
|
+
// The information is returned as a result set which can be fetched
|
|
603
|
+
// using the OperationHandle provided in the response.
|
|
604
|
+
//
|
|
605
|
+
// Refer to the documentation for ODBC's CLIGetTypeInfo function for
|
|
606
|
+
// the format of the result set.
|
|
607
|
+
struct TGetTypeInfoReq {
|
|
608
|
+
// The session to run this request against.
|
|
609
|
+
1: required TSessionHandle sessionHandle
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
struct TGetTypeInfoResp {
|
|
613
|
+
1: required TStatus status
|
|
614
|
+
2: optional TOperationHandle operationHandle
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
|
|
618
|
+
// GetCatalogs()
|
|
619
|
+
//
|
|
620
|
+
// Returns the list of catalogs (databases)
|
|
621
|
+
// Results are ordered by TABLE_CATALOG
|
|
622
|
+
//
|
|
623
|
+
// Resultset columns :
|
|
624
|
+
// col1
|
|
625
|
+
// name: TABLE_CAT
|
|
626
|
+
// type: STRING
|
|
627
|
+
// desc: Catalog name. NULL if not applicable.
|
|
628
|
+
//
|
|
629
|
+
struct TGetCatalogsReq {
|
|
630
|
+
// Session to run this request against
|
|
631
|
+
1: required TSessionHandle sessionHandle
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
struct TGetCatalogsResp {
|
|
635
|
+
1: required TStatus status
|
|
636
|
+
2: optional TOperationHandle operationHandle
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
|
|
640
|
+
// GetSchemas()
|
|
641
|
+
//
|
|
642
|
+
// Retrieves the schema names available in this database.
|
|
643
|
+
// The results are ordered by TABLE_CATALOG and TABLE_SCHEM.
|
|
644
|
+
// col1
|
|
645
|
+
// name: TABLE_SCHEM
|
|
646
|
+
// type: STRING
|
|
647
|
+
// desc: schema name
|
|
648
|
+
// col2
|
|
649
|
+
// name: TABLE_CATALOG
|
|
650
|
+
// type: STRING
|
|
651
|
+
// desc: catalog name
|
|
652
|
+
struct TGetSchemasReq {
|
|
653
|
+
// Session to run this request against
|
|
654
|
+
1: required TSessionHandle sessionHandle
|
|
655
|
+
|
|
656
|
+
// Name of the catalog. Must not contain a search pattern.
|
|
657
|
+
2: optional TIdentifier catalogName
|
|
658
|
+
|
|
659
|
+
// schema name or pattern
|
|
660
|
+
3: optional TPatternOrIdentifier schemaName
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
struct TGetSchemasResp {
|
|
664
|
+
1: required TStatus status
|
|
665
|
+
2: optional TOperationHandle operationHandle
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
|
|
669
|
+
// GetTables()
|
|
670
|
+
//
|
|
671
|
+
// Returns a list of tables with catalog, schema, and table
|
|
672
|
+
// type information. The information is returned as a result
|
|
673
|
+
// set which can be fetched using the OperationHandle
|
|
674
|
+
// provided in the response.
|
|
675
|
+
// Results are ordered by TABLE_TYPE, TABLE_CAT, TABLE_SCHEM, and TABLE_NAME
|
|
676
|
+
//
|
|
677
|
+
// Result Set Columns:
|
|
678
|
+
//
|
|
679
|
+
// col1
|
|
680
|
+
// name: TABLE_CAT
|
|
681
|
+
// type: STRING
|
|
682
|
+
// desc: Catalog name. NULL if not applicable.
|
|
683
|
+
//
|
|
684
|
+
// col2
|
|
685
|
+
// name: TABLE_SCHEM
|
|
686
|
+
// type: STRING
|
|
687
|
+
// desc: Schema name.
|
|
688
|
+
//
|
|
689
|
+
// col3
|
|
690
|
+
// name: TABLE_NAME
|
|
691
|
+
// type: STRING
|
|
692
|
+
// desc: Table name.
|
|
693
|
+
//
|
|
694
|
+
// col4
|
|
695
|
+
// name: TABLE_TYPE
|
|
696
|
+
// type: STRING
|
|
697
|
+
// desc: The table type, e.g. "TABLE", "VIEW", etc.
|
|
698
|
+
//
|
|
699
|
+
// col5
|
|
700
|
+
// name: REMARKS
|
|
701
|
+
// type: STRING
|
|
702
|
+
// desc: Comments about the table
|
|
703
|
+
//
|
|
704
|
+
struct TGetTablesReq {
|
|
705
|
+
// Session to run this request against
|
|
706
|
+
1: required TSessionHandle sessionHandle
|
|
707
|
+
|
|
708
|
+
// Name of the catalog or a search pattern.
|
|
709
|
+
2: optional TPatternOrIdentifier catalogName
|
|
710
|
+
|
|
711
|
+
// Name of the schema or a search pattern.
|
|
712
|
+
3: optional TPatternOrIdentifier schemaName
|
|
713
|
+
|
|
714
|
+
// Name of the table or a search pattern.
|
|
715
|
+
4: optional TPatternOrIdentifier tableName
|
|
716
|
+
|
|
717
|
+
// List of table types to match
|
|
718
|
+
// e.g. "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY",
|
|
719
|
+
// "LOCAL TEMPORARY", "ALIAS", "SYNONYM", etc.
|
|
720
|
+
5: optional list<string> tableTypes
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
struct TGetTablesResp {
|
|
724
|
+
1: required TStatus status
|
|
725
|
+
2: optional TOperationHandle operationHandle
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
|
|
729
|
+
// GetTableTypes()
|
|
730
|
+
//
|
|
731
|
+
// Returns the table types available in this database.
|
|
732
|
+
// The results are ordered by table type.
|
|
733
|
+
//
|
|
734
|
+
// col1
|
|
735
|
+
// name: TABLE_TYPE
|
|
736
|
+
// type: STRING
|
|
737
|
+
// desc: Table type name.
|
|
738
|
+
struct TGetTableTypesReq {
|
|
739
|
+
// Session to run this request against
|
|
740
|
+
1: required TSessionHandle sessionHandle
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
struct TGetTableTypesResp {
|
|
744
|
+
1: required TStatus status
|
|
745
|
+
2: optional TOperationHandle operationHandle
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
|
|
749
|
+
// GetColumns()
|
|
750
|
+
//
|
|
751
|
+
// Returns a list of columns in the specified tables.
|
|
752
|
+
// The information is returned as a result set which can be fetched
|
|
753
|
+
// using the OperationHandle provided in the response.
|
|
754
|
+
// Results are ordered by TABLE_CAT, TABLE_SCHEM, TABLE_NAME,
|
|
755
|
+
// and ORDINAL_POSITION.
|
|
756
|
+
//
|
|
757
|
+
// Result Set Columns are the same as those for the ODBC CLIColumns
|
|
758
|
+
// function.
|
|
759
|
+
//
|
|
760
|
+
struct TGetColumnsReq {
|
|
761
|
+
// Session to run this request against
|
|
762
|
+
1: required TSessionHandle sessionHandle
|
|
763
|
+
|
|
764
|
+
// Name of the catalog. Must not contain a search pattern.
|
|
765
|
+
2: optional TIdentifier catalogName
|
|
766
|
+
|
|
767
|
+
// Schema name or search pattern
|
|
768
|
+
3: optional TPatternOrIdentifier schemaName
|
|
769
|
+
|
|
770
|
+
// Table name or search pattern
|
|
771
|
+
4: optional TPatternOrIdentifier tableName
|
|
772
|
+
|
|
773
|
+
// Column name or search pattern
|
|
774
|
+
5: optional TPatternOrIdentifier columnName
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
struct TGetColumnsResp {
|
|
778
|
+
1: required TStatus status
|
|
779
|
+
2: optional TOperationHandle operationHandle
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
|
|
783
|
+
// GetFunctions()
|
|
784
|
+
//
|
|
785
|
+
// Returns a list of functions supported by the data source. The
|
|
786
|
+
// behavior of this function matches
|
|
787
|
+
// java.sql.DatabaseMetaData.getFunctions() both in terms of
|
|
788
|
+
// inputs and outputs.
|
|
789
|
+
//
|
|
790
|
+
// Result Set Columns:
|
|
791
|
+
//
|
|
792
|
+
// col1
|
|
793
|
+
// name: FUNCTION_CAT
|
|
794
|
+
// type: STRING
|
|
795
|
+
// desc: Function catalog (may be null)
|
|
796
|
+
//
|
|
797
|
+
// col2
|
|
798
|
+
// name: FUNCTION_SCHEM
|
|
799
|
+
// type: STRING
|
|
800
|
+
// desc: Function schema (may be null)
|
|
801
|
+
//
|
|
802
|
+
// col3
|
|
803
|
+
// name: FUNCTION_NAME
|
|
804
|
+
// type: STRING
|
|
805
|
+
// desc: Function name. This is the name used to invoke the function.
|
|
806
|
+
//
|
|
807
|
+
// col4
|
|
808
|
+
// name: REMARKS
|
|
809
|
+
// type: STRING
|
|
810
|
+
// desc: Explanatory comment on the function.
|
|
811
|
+
//
|
|
812
|
+
// col5
|
|
813
|
+
// name: FUNCTION_TYPE
|
|
814
|
+
// type: SMALLINT
|
|
815
|
+
// desc: Kind of function. One of:
|
|
816
|
+
// * functionResultUnknown - Cannot determine if a return value or a table
|
|
817
|
+
// will be returned.
|
|
818
|
+
// * functionNoTable - Does not a return a table.
|
|
819
|
+
// * functionReturnsTable - Returns a table.
|
|
820
|
+
//
|
|
821
|
+
// col6
|
|
822
|
+
// name: SPECIFIC_NAME
|
|
823
|
+
// type: STRING
|
|
824
|
+
// desc: The name which uniquely identifies this function within its schema.
|
|
825
|
+
// In this case this is the fully qualified class name of the class
|
|
826
|
+
// that implements this function.
|
|
827
|
+
//
|
|
828
|
+
struct TGetFunctionsReq {
|
|
829
|
+
// Session to run this request against
|
|
830
|
+
1: required TSessionHandle sessionHandle
|
|
831
|
+
|
|
832
|
+
// A catalog name; must match the catalog name as it is stored in the
|
|
833
|
+
// database; "" retrieves those without a catalog; null means
|
|
834
|
+
// that the catalog name should not be used to narrow the search.
|
|
835
|
+
2: optional TIdentifier catalogName
|
|
836
|
+
|
|
837
|
+
// A schema name pattern; must match the schema name as it is stored
|
|
838
|
+
// in the database; "" retrieves those without a schema; null means
|
|
839
|
+
// that the schema name should not be used to narrow the search.
|
|
840
|
+
3: optional TPatternOrIdentifier schemaName
|
|
841
|
+
|
|
842
|
+
// A function name pattern; must match the function name as it is stored
|
|
843
|
+
// in the database.
|
|
844
|
+
4: required TPatternOrIdentifier functionName
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
struct TGetFunctionsResp {
|
|
848
|
+
1: required TStatus status
|
|
849
|
+
2: optional TOperationHandle operationHandle
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
|
|
853
|
+
// GetOperationStatus()
|
|
854
|
+
//
|
|
855
|
+
// Get the status of an operation running on the server.
|
|
856
|
+
struct TGetOperationStatusReq {
|
|
857
|
+
// Session to run this request against
|
|
858
|
+
1: required TOperationHandle operationHandle
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
struct TGetOperationStatusResp {
|
|
862
|
+
1: required TStatus status
|
|
863
|
+
2: optional TOperationState operationState
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
|
|
867
|
+
// CancelOperation()
|
|
868
|
+
//
|
|
869
|
+
// Cancels processing on the specified operation handle and
|
|
870
|
+
// frees any resources which were allocated.
|
|
871
|
+
struct TCancelOperationReq {
|
|
872
|
+
// Operation to cancel
|
|
873
|
+
1: required TOperationHandle operationHandle
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
struct TCancelOperationResp {
|
|
877
|
+
1: required TStatus status
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
|
|
881
|
+
// CloseOperation()
|
|
882
|
+
//
|
|
883
|
+
// Given an operation in the FINISHED, CANCELED,
|
|
884
|
+
// or ERROR states, CloseOperation() will free
|
|
885
|
+
// all of the resources which were allocated on
|
|
886
|
+
// the server to service the operation.
|
|
887
|
+
struct TCloseOperationReq {
|
|
888
|
+
1: required TOperationHandle operationHandle
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
struct TCloseOperationResp {
|
|
892
|
+
1: required TStatus status
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
|
|
896
|
+
// GetResultSetMetadata()
|
|
897
|
+
//
|
|
898
|
+
// Retrieves schema information for the specified operation
|
|
899
|
+
struct TGetResultSetMetadataReq {
|
|
900
|
+
// Operation for which to fetch result set schema information
|
|
901
|
+
1: required TOperationHandle operationHandle
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
struct TGetResultSetMetadataResp {
|
|
905
|
+
1: required TStatus status
|
|
906
|
+
2: optional TTableSchema schema
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
|
|
910
|
+
enum TFetchOrientation {
|
|
911
|
+
// Get the next rowset. The fetch offset is ignored.
|
|
912
|
+
FETCH_NEXT,
|
|
913
|
+
|
|
914
|
+
// Get the previous rowset. The fetch offset is ignored.
|
|
915
|
+
// NOT SUPPORTED
|
|
916
|
+
FETCH_PRIOR,
|
|
917
|
+
|
|
918
|
+
// Return the rowset at the given fetch offset relative
|
|
919
|
+
// to the curren rowset.
|
|
920
|
+
// NOT SUPPORTED
|
|
921
|
+
FETCH_RELATIVE,
|
|
922
|
+
|
|
923
|
+
// Return the rowset at the specified fetch offset.
|
|
924
|
+
// NOT SUPPORTED
|
|
925
|
+
FETCH_ABSOLUTE,
|
|
926
|
+
|
|
927
|
+
// Get the first rowset in the result set.
|
|
928
|
+
FETCH_FIRST,
|
|
929
|
+
|
|
930
|
+
// Get the last rowset in the result set.
|
|
931
|
+
// NOT SUPPORTED
|
|
932
|
+
FETCH_LAST
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
// FetchResults()
|
|
936
|
+
//
|
|
937
|
+
// Fetch rows from the server corresponding to
|
|
938
|
+
// a particular OperationHandle.
|
|
939
|
+
struct TFetchResultsReq {
|
|
940
|
+
// Operation from which to fetch results.
|
|
941
|
+
1: required TOperationHandle operationHandle
|
|
942
|
+
|
|
943
|
+
// The fetch orientation. For V1 this must be either
|
|
944
|
+
// FETCH_NEXT or FETCH_FIRST. Defaults to FETCH_NEXT.
|
|
945
|
+
2: required TFetchOrientation orientation = TFetchOrientation.FETCH_NEXT
|
|
946
|
+
|
|
947
|
+
// Max number of rows that should be returned in
|
|
948
|
+
// the rowset.
|
|
949
|
+
3: required i64 maxRows
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
struct TFetchResultsResp {
|
|
953
|
+
1: required TStatus status
|
|
954
|
+
|
|
955
|
+
// TRUE if there are more rows left to fetch from the server.
|
|
956
|
+
2: optional bool hasMoreRows
|
|
957
|
+
|
|
958
|
+
// The rowset. This is optional so that we have the
|
|
959
|
+
// option in the future of adding alternate formats for
|
|
960
|
+
// representing result set data, e.g. delimited strings,
|
|
961
|
+
// binary encoded, etc.
|
|
962
|
+
3: optional TRowSet results
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
// GetLog()
|
|
966
|
+
//
|
|
967
|
+
// Fetch operation log from the server corresponding to
|
|
968
|
+
// a particular OperationHandle.
|
|
969
|
+
struct TGetLogReq {
|
|
970
|
+
// Operation whose log is requested
|
|
971
|
+
1: required TOperationHandle operationHandle
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
struct TGetLogResp {
|
|
975
|
+
1: required TStatus status
|
|
976
|
+
|
|
977
|
+
2: required string log
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
service TCLIService {
|
|
981
|
+
|
|
982
|
+
TOpenSessionResp OpenSession(1:TOpenSessionReq req);
|
|
983
|
+
|
|
984
|
+
TCloseSessionResp CloseSession(1:TCloseSessionReq req);
|
|
985
|
+
|
|
986
|
+
TGetInfoResp GetInfo(1:TGetInfoReq req);
|
|
987
|
+
|
|
988
|
+
TExecuteStatementResp ExecuteStatement(1:TExecuteStatementReq req);
|
|
989
|
+
|
|
990
|
+
TGetTypeInfoResp GetTypeInfo(1:TGetTypeInfoReq req);
|
|
991
|
+
|
|
992
|
+
TGetCatalogsResp GetCatalogs(1:TGetCatalogsReq req);
|
|
993
|
+
|
|
994
|
+
TGetSchemasResp GetSchemas(1:TGetSchemasReq req);
|
|
995
|
+
|
|
996
|
+
TGetTablesResp GetTables(1:TGetTablesReq req);
|
|
997
|
+
|
|
998
|
+
TGetTableTypesResp GetTableTypes(1:TGetTableTypesReq req);
|
|
999
|
+
|
|
1000
|
+
TGetColumnsResp GetColumns(1:TGetColumnsReq req);
|
|
1001
|
+
|
|
1002
|
+
TGetFunctionsResp GetFunctions(1:TGetFunctionsReq req);
|
|
1003
|
+
|
|
1004
|
+
TGetOperationStatusResp GetOperationStatus(1:TGetOperationStatusReq req);
|
|
1005
|
+
|
|
1006
|
+
TCancelOperationResp CancelOperation(1:TCancelOperationReq req);
|
|
1007
|
+
|
|
1008
|
+
TCloseOperationResp CloseOperation(1:TCloseOperationReq req);
|
|
1009
|
+
|
|
1010
|
+
TGetResultSetMetadataResp GetResultSetMetadata(1:TGetResultSetMetadataReq req);
|
|
1011
|
+
|
|
1012
|
+
TFetchResultsResp FetchResults(1:TFetchResultsReq req);
|
|
1013
|
+
|
|
1014
|
+
TGetLogResp GetLog(1:TGetLogReq req);
|
|
1015
|
+
}
|