-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathodbc_sql_info.cc
More file actions
563 lines (531 loc) · 15 KB
/
Copy pathodbc_sql_info.cc
File metadata and controls
563 lines (531 loc) · 15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
// Copyright 2023 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "google/cloud/odbc/bq_driver/internal/odbc_sql_info.h"
#include "google/cloud/odbc/bq_driver/internal/trace_utils.h"
#include <cstring>
namespace google::cloud::odbc_bq_driver_internal {
using ::google::cloud::odbc_internal::SQLStates;
using ::google::cloud::odbc_internal::StatusRecord;
using ::google::cloud::odbc_internal::StatusRecordOr;
// Helper functions
namespace {
StatusRecord InvalidType(SQLUSMALLINT info_type) {
std::string msg = "Invalid infoType: ";
msg.append(std::to_string(info_type));
LOG(ERROR) << "InvalidType:: " << msg;
return StatusRecord{SQLStates::k_HY096(), msg};
}
} // namespace
StatusRecordOr<SQLGetInfoSqlChar> SQLGetInfoSqlChar::GetSupportedInfoType(
SQLUSMALLINT info_type) {
SQLGetInfoSqlChar result;
switch (info_type) {
case SQL_CATALOG_NAME:
case SQL_COLUMN_ALIAS:
case SQL_DESCRIBE_PARAMETER:
case SQL_EXPRESSIONS_IN_ORDERBY:
case SQL_MULTIPLE_ACTIVE_TXN:
case SQL_PROCEDURES:
case SQL_ACCESSIBLE_TABLES: {
result.info_val =
reinterpret_cast<SQLCHAR*>(const_cast<char*>(kSupportedCharY));
break;
}
case SQL_CATALOG_NAME_SEPARATOR: {
result.info_val =
reinterpret_cast<SQLCHAR*>(const_cast<char*>(kCatalogSeparator));
break;
}
case SQL_CATALOG_TERM: {
result.info_val =
reinterpret_cast<SQLCHAR*>(const_cast<char*>(kCatalogTerm));
break;
}
case SQL_COLLATION_SEQ: {
result.info_val =
reinterpret_cast<SQLCHAR*>(const_cast<char*>(kDefaultCollation));
break;
}
case SQL_DBMS_NAME: {
result.info_val =
reinterpret_cast<SQLCHAR*>(const_cast<char*>(kDbmsName));
break;
}
case SQL_DBMS_VER: {
result.info_val = reinterpret_cast<SQLCHAR*>(const_cast<char*>(kDbmsVer));
break;
}
case SQL_DRIVER_NAME: {
result.info_val =
reinterpret_cast<SQLCHAR*>(const_cast<char*>(kDriverName));
break;
}
case SQL_DRIVER_ODBC_VER: {
result.info_val =
reinterpret_cast<SQLCHAR*>(const_cast<char*>(kDriverOdbcVer));
break;
}
case SQL_DRIVER_VER: {
result.info_val =
reinterpret_cast<SQLCHAR*>(const_cast<char*>(kDriverVer));
break;
}
case SQL_IDENTIFIER_QUOTE_CHAR: {
result.info_val =
reinterpret_cast<SQLCHAR*>(const_cast<char*>(kIdentifierQuoteChar));
break;
}
case SQL_SCHEMA_TERM: {
result.info_val =
reinterpret_cast<SQLCHAR*>(const_cast<char*>(kSchemaTerm));
break;
}
case SQL_SEARCH_PATTERN_ESCAPE: {
result.info_val =
reinterpret_cast<SQLCHAR*>(const_cast<char*>(kSearchPatternEscape));
break;
}
case SQL_SERVER_NAME: {
result.info_val =
reinterpret_cast<SQLCHAR*>(const_cast<char*>(kSqlServerName));
break;
}
case SQL_TABLE_TERM: {
result.info_val =
reinterpret_cast<SQLCHAR*>(const_cast<char*>(kSqlTableTerm));
break;
}
default: {
return InvalidType(info_type);
}
}
return result;
}
StatusRecordOr<SQLGetInfoSqlChar> SQLGetInfoSqlChar::GetUnSupportedInfoType(
SQLUSMALLINT info_type) {
SQLGetInfoSqlChar result;
switch (info_type) {
case SQL_KEYWORDS:
case SQL_PROCEDURE_TERM:
case SQL_SPECIAL_CHARACTERS:
case SQL_USER_NAME: {
result.info_val = reinterpret_cast<SQLCHAR*>(const_cast<char*>(""));
break;
}
case SQL_ACCESSIBLE_PROCEDURES:
case SQL_DATA_SOURCE_READ_ONLY:
case SQL_INTEGRITY:
case SQL_LIKE_ESCAPE_CLAUSE:
case SQL_MAX_ROW_SIZE_INCLUDES_LONG:
case SQL_MULT_RESULT_SETS:
case SQL_NEED_LONG_DATA_LEN:
case SQL_ORDER_BY_COLUMNS_IN_SELECT:
case SQL_ROW_UPDATES: {
result.info_val = reinterpret_cast<SQLCHAR*>(const_cast<char*>("N"));
break;
}
default: {
return InvalidType(info_type);
}
}
return result;
}
StatusRecordOr<SQLGetInfoSqlUSmallInt>
SQLGetInfoSqlUSmallInt::GetSupportedInfoType(SQLUSMALLINT info_type) {
SQLGetInfoSqlUSmallInt result;
switch (info_type) {
case SQL_CATALOG_LOCATION: {
result.info_val = kCatalogLocation;
break;
}
case SQL_CORRELATION_NAME: {
result.info_val = kCorrelationName;
break;
}
case SQL_CURSOR_COMMIT_BEHAVIOR: {
result.info_val = kCursorCommitBehavior;
break;
}
case SQL_CURSOR_ROLLBACK_BEHAVIOR: {
result.info_val = kCursorRollbackBehavior;
break;
}
case SQL_GROUP_BY: {
result.info_val = kGroupBy;
break;
}
case SQL_IDENTIFIER_CASE: {
result.info_val = kIdentifierCase;
break;
}
case SQL_MAX_CATALOG_NAME_LEN: {
result.info_val = kMaxCatalogNameLen;
break;
}
case SQL_MAX_COLUMNS_IN_TABLE: {
result.info_val = kMaxColsInTable;
break;
}
case SQL_MAX_COLUMN_NAME_LEN: {
result.info_val = kMaxColNameLen;
break;
}
case SQL_MAX_IDENTIFIER_LEN: {
result.info_val = kMaxIdentifierLen;
break;
}
case SQL_MAX_SCHEMA_NAME_LEN: {
result.info_val = kMaxSchemaNameLen;
break;
}
case SQL_MAX_TABLES_IN_SELECT: {
result.info_val = kMaxTablesInSelect;
break;
}
case SQL_MAX_TABLE_NAME_LEN: {
result.info_val = kMaxTableNameLen;
break;
}
case SQL_NULL_COLLATION: {
result.info_val = kNullCollation;
break;
}
case SQL_QUOTED_IDENTIFIER_CASE: {
result.info_val = kQuotedIdentifierCase;
break;
}
case SQL_TXN_CAPABLE: {
result.info_val = kTxnCapable;
break;
}
case SQL_ODBC_API_CONFORMANCE: {
result.info_val = kOdbcApiConformance;
break;
}
default: {
return InvalidType(info_type);
}
}
return result;
}
StatusRecordOr<SQLGetInfoSqlUSmallInt>
SQLGetInfoSqlUSmallInt::GetUnSupportedInfoType(SQLUSMALLINT info_type) {
SQLGetInfoSqlUSmallInt result;
switch (info_type) {
case SQL_ACTIVE_ENVIRONMENTS:
case SQL_CONCAT_NULL_BEHAVIOR:
case SQL_FILE_USAGE:
case SQL_MAX_COLUMNS_IN_GROUP_BY:
case SQL_MAX_COLUMNS_IN_INDEX:
case SQL_MAX_COLUMNS_IN_ORDER_BY:
case SQL_MAX_COLUMNS_IN_SELECT:
case SQL_MAX_CONCURRENT_ACTIVITIES:
case SQL_MAX_CURSOR_NAME_LEN:
case SQL_MAX_DRIVER_CONNECTIONS:
case SQL_MAX_PROCEDURE_NAME_LEN:
case SQL_MAX_USER_NAME_LEN:
case SQL_NON_NULLABLE_COLUMNS: {
result.info_val = static_cast<SQLUSMALLINT>(0);
break;
}
default: {
return InvalidType(info_type);
}
}
return result;
}
StatusRecordOr<SQLGetInfoSqlUInt> SQLGetInfoSqlUInt::GetSupportedInfoType(
SQLUSMALLINT info_type) {
SQLGetInfoSqlUInt result;
switch (info_type) {
case SQL_ASYNC_MODE: {
result.info_val = kAsyncMode;
break;
}
case SQL_DEFAULT_TXN_ISOLATION: {
result.info_val = kDefaultTxnIsolation;
break;
}
case SQL_ODBC_INTERFACE_CONFORMANCE: {
result.info_val = kOdbcInterfaceConformance;
break;
}
case SQL_SQL_CONFORMANCE: {
result.info_val = kSqlConformance;
break;
}
default: {
return InvalidType(info_type);
}
}
return result;
}
StatusRecordOr<SQLGetInfoSqlUInt> SQLGetInfoSqlUInt::GetUnSupportedInfoType(
SQLUSMALLINT info_type) {
SQLGetInfoSqlUInt result;
switch (info_type) {
case SQL_BATCH_ROW_COUNT:
case SQL_BATCH_SUPPORT:
case SQL_BOOKMARK_PERSISTENCE:
case SQL_CURSOR_SENSITIVITY:
case SQL_DDL_INDEX:
case SQL_MAX_ASYNC_CONCURRENT_STATEMENTS:
case SQL_MAX_BINARY_LITERAL_LEN:
case SQL_MAX_CHAR_LITERAL_LEN:
case SQL_MAX_INDEX_SIZE:
case SQL_MAX_ROW_SIZE:
case SQL_MAX_STATEMENT_LEN:
case SQL_PARAM_ARRAY_ROW_COUNTS:
case SQL_PARAM_ARRAY_SELECTS: {
result.info_val = static_cast<SQLUINTEGER>(0);
break;
}
default: {
return InvalidType(info_type);
}
}
return result;
}
StatusRecordOr<SQLGetInfoBitmask> SQLGetInfoBitmask::GetSupportedInfoType(
SQLUSMALLINT info_type) {
SQLGetInfoBitmask result;
switch (info_type) {
case SQL_AGGREGATE_FUNCTIONS: {
result.info_val = kAggregateFns;
break;
}
case SQL_CATALOG_USAGE: {
result.info_val = kCatalogUsage;
break;
}
case SQL_CONVERT_BIGINT: {
result.info_val = kConvertBigInt;
break;
}
case SQL_CONVERT_BIT: {
result.info_val = kConvertBit;
break;
}
case SQL_CONVERT_DATE: {
result.info_val = kConvertDate;
break;
}
case SQL_CONVERT_DOUBLE: {
result.info_val = kConvertDouble;
break;
}
case SQL_CONVERT_FUNCTIONS: {
result.info_val = kConvertFn;
break;
}
case SQL_CONVERT_TIME: {
result.info_val = kConvertTime;
break;
}
case SQL_CONVERT_TIMESTAMP: {
result.info_val = kConvertTimestamp;
break;
}
case SQL_CONVERT_VARBINARY: {
result.info_val = kConvertVarBinary;
break;
}
case SQL_CONVERT_VARCHAR: {
result.info_val = kConvertVarChar;
break;
}
case SQL_DATETIME_LITERALS: {
result.info_val = kDateTimeLiterals;
break;
}
case SQL_SQL92_DATETIME_FUNCTIONS: {
result.info_val = kDateTimeFns;
break;
}
case SQL_GETDATA_EXTENSIONS: {
result.info_val = kGetDataExtns;
break;
}
case SQL_STRING_FUNCTIONS: {
result.info_val = kStrFns;
break;
}
case SQL_SYSTEM_FUNCTIONS: {
result.info_val = kSystemFns;
break;
}
case SQL_TIMEDATE_FUNCTIONS: {
result.info_val = kTimeDateFns;
break;
}
case SQL_TXN_ISOLATION_OPTION: {
result.info_val = kTxnSerializable;
break;
}
case SQL_TIMEDATE_ADD_INTERVALS: {
result.info_val = kTimeDateAddIntervals;
break;
}
case SQL_TIMEDATE_DIFF_INTERVALS: {
result.info_val = kTimeDateDiffIntervals;
break;
}
case SQL_SUBQUERIES: {
result.info_val = kSubQueries;
break;
}
case SQL_SQL92_PREDICATES: {
result.info_val = kPredicates;
break;
}
case SQL_SQL92_STRING_FUNCTIONS: {
result.info_val = kSql92StrFns;
break;
}
case SQL_STANDARD_CLI_CONFORMANCE: {
result.info_val = kCliConformance;
break;
}
case SQL_SQL92_VALUE_EXPRESSIONS: {
result.info_val = kValueExpressions;
break;
}
case SQL_SQL92_ROW_VALUE_CONSTRUCTOR: {
result.info_val = kRowValueCtr;
break;
}
case SQL_SQL92_RELATIONAL_JOIN_OPERATORS: {
result.info_val = kJoinOperators;
break;
}
case SQL_SCROLL_OPTIONS: {
result.info_val = kScrollOptions;
break;
}
case SQL_OJ_CAPABILITIES: {
result.info_val = kOJCapabilities;
break;
}
case SQL_SCHEMA_USAGE: {
result.info_val = kSchemaUsage;
break;
}
case SQL_NUMERIC_FUNCTIONS: {
result.info_val = kNumericFns;
break;
}
default: {
return InvalidType(info_type);
}
}
return result;
}
StatusRecordOr<SQLGetInfoBitmask> SQLGetInfoBitmask::GetUnSupportedInfoType(
SQLUSMALLINT info_type) {
SQLGetInfoBitmask result;
switch (info_type) {
case SQL_ALTER_DOMAIN:
case SQL_ALTER_TABLE:
case SQL_CONVERT_BINARY:
case SQL_CONVERT_CHAR:
case SQL_CONVERT_DECIMAL:
case SQL_CONVERT_FLOAT:
case SQL_CONVERT_INTEGER:
case SQL_CONVERT_INTERVAL_DAY_TIME:
case SQL_CONVERT_INTERVAL_YEAR_MONTH:
case SQL_CONVERT_LONGVARBINARY:
case SQL_CONVERT_LONGVARCHAR:
case SQL_CONVERT_NUMERIC:
case SQL_CONVERT_REAL:
case SQL_CONVERT_SMALLINT:
case SQL_CONVERT_TINYINT:
case SQL_CREATE_ASSERTION:
case SQL_CREATE_CHARACTER_SET:
case SQL_CREATE_COLLATION:
case SQL_CREATE_DOMAIN:
case SQL_CREATE_SCHEMA:
case SQL_CREATE_TABLE:
case SQL_CREATE_TRANSLATION:
case SQL_CREATE_VIEW:
case SQL_DROP_ASSERTION:
case SQL_DROP_CHARACTER_SET:
case SQL_DROP_COLLATION:
case SQL_DROP_DOMAIN:
case SQL_DROP_SCHEMA:
case SQL_DROP_TABLE:
case SQL_DROP_TRANSLATION:
case SQL_DROP_VIEW:
case SQL_DYNAMIC_CURSOR_ATTRIBUTES1:
case SQL_DYNAMIC_CURSOR_ATTRIBUTES2:
case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1:
case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2:
case SQL_INDEX_KEYWORDS:
case SQL_INFO_SCHEMA_VIEWS:
case SQL_INSERT_STATEMENT:
case SQL_KEYSET_CURSOR_ATTRIBUTES1:
case SQL_KEYSET_CURSOR_ATTRIBUTES2:
case SQL_POS_OPERATIONS:
case SQL_SQL92_FOREIGN_KEY_DELETE_RULE:
case SQL_SQL92_FOREIGN_KEY_UPDATE_RULE:
case SQL_SQL92_GRANT:
case SQL_SQL92_NUMERIC_VALUE_FUNCTIONS:
case SQL_SQL92_REVOKE:
case SQL_STATIC_CURSOR_ATTRIBUTES1:
case SQL_STATIC_CURSOR_ATTRIBUTES2:
case SQL_UNION: {
result.info_val = static_cast<SQLUINTEGER>(0L);
break;
}
default: {
return InvalidType(info_type);
}
}
return result;
}
void SQLGetInfoVal::AddDiagnostics(ConnectionHandle* handle,
StatusRecord const& status_record) {
if (handle) {
LOG(INFO) << "SQLGetInfoVal::AddDiagnostics:: Adding diagnostic record: "
"[SQLSTATE="
<< status_record.sql_state << "] " << status_record.message;
handle->GetDiagnostics().AddStatusRecord(status_record);
}
}
SQLRETURN SQLGetInfoSqlChar::InfoValToResponse(ConnectionHandle* handle,
SQLPOINTER info_val_ptr,
SQLSMALLINT in_buffer_len,
SQLSMALLINT* str_len_ptr) const {
auto status_record = StringValueToOutputBufferResponse(
reinterpret_cast<char*>(info_val), info_val_ptr, in_buffer_len,
str_len_ptr);
if (!status_record.ok()) {
LOG(WARNING) << "SQLGetInfoSqlChar::InfoValToResponse:: "
<< status_record.message;
AddDiagnostics(handle, status_record);
}
return status_record.CalculateReturnCode();
}
SQLRETURN SQLGetInfoSqlUInt::InfoValToResponse(SQLPOINTER info_val_ptr,
SQLSMALLINT* str_len_ptr) const {
return IntValueToOutputBufferResponse(info_val, info_val_ptr, str_len_ptr);
}
SQLRETURN SQLGetInfoBitmask::InfoValToResponse(SQLPOINTER info_val_ptr,
SQLSMALLINT* str_len_ptr) const {
return IntValueToOutputBufferResponse(info_val, info_val_ptr, str_len_ptr);
}
SQLRETURN SQLGetInfoSqlUSmallInt::InfoValToResponse(
SQLPOINTER info_val_ptr, SQLSMALLINT* str_len_ptr) const {
return IntValueToOutputBufferResponse(info_val, info_val_ptr, str_len_ptr);
}
} // namespace google::cloud::odbc_bq_driver_internal