Line data Source code
1 : /*
2 : * SPDX-License-Identifier: MPL-2.0
3 : *
4 : * This Source Code Form is subject to the terms of the Mozilla Public
5 : * License, v. 2.0. If a copy of the MPL was not distributed with this
6 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 : *
8 : * Copyright 2024 MonetDB Foundation;
9 : * Copyright August 2008 - 2023 MonetDB B.V.;
10 : * Copyright 1997 - July 2008 CWI.
11 : */
12 :
13 : /*
14 : * This code was created by Peter Harvey (mostly during Christmas 98/99).
15 : * This code is LGPL. Please ensure that this message remains in future
16 : * distributions and uses of this code (thats about all I get out of it).
17 : * - Peter Harvey pharvey@codebydesign.com
18 : *
19 : * This file has been modified for the MonetDB project. See the file
20 : * Copyright in this directory for more information.
21 : */
22 :
23 : /**********************************************************************
24 : * SQLGetInfo()
25 : * CLI Compliance: ISO 92
26 : *
27 : * Author: Martin van Dinther, Sjoerd Mullender
28 : * Date : 30 Aug 2002
29 : *
30 : **********************************************************************/
31 :
32 : #include "ODBCGlobal.h"
33 : #include "ODBCDbc.h"
34 : #include "ODBCUtil.h"
35 :
36 :
37 : static SQLRETURN
38 165 : MNDBGetInfo(ODBCDbc *dbc,
39 : SQLUSMALLINT InfoType,
40 : SQLPOINTER InfoValuePtr,
41 : SQLSMALLINT BufferLength,
42 : SQLSMALLINT *StringLengthPtr)
43 : {
44 165 : int nValue = 0;
45 165 : char buf[64];
46 165 : const char *sValue = NULL; /* iff non-NULL, return string value */
47 165 : int len = sizeof(SQLUINTEGER); /* most common size to return */
48 165 : MapiHdl hdl = NULL;
49 :
50 : /* For some info types an active connection is needed */
51 165 : if (!dbc->Connected &&
52 0 : (InfoType == SQL_DATA_SOURCE_NAME ||
53 0 : InfoType == SQL_DATABASE_NAME ||
54 : InfoType == SQL_DBMS_VER ||
55 : InfoType == SQL_MAX_DRIVER_CONNECTIONS ||
56 : InfoType == SQL_USER_NAME ||
57 : InfoType == SQL_KEYWORDS)) {
58 : /* Connection does not exist */
59 0 : addDbcError(dbc, "08003", NULL, 0);
60 0 : return SQL_ERROR;
61 : }
62 :
63 165 : switch (InfoType) {
64 : case SQL_ACCESSIBLE_PROCEDURES:
65 2 : sValue = "N"; /* "Y" */
66 : break;
67 : case SQL_ACCESSIBLE_TABLES:
68 2 : sValue = "N"; /* "Y" */
69 : break;
70 0 : case SQL_ACTIVE_ENVIRONMENTS:
71 0 : nValue = 0; /* 0 = no limit */
72 0 : len = sizeof(SQLUSMALLINT);
73 0 : break;
74 : case SQL_AGGREGATE_FUNCTIONS:
75 2 : nValue = SQL_AF_ALL |
76 : SQL_AF_AVG |
77 : SQL_AF_COUNT |
78 : SQL_AF_DISTINCT |
79 : SQL_AF_MAX |
80 : SQL_AF_MIN |
81 : SQL_AF_SUM;
82 : break;
83 : case SQL_ALTER_DOMAIN:
84 : /* SQL_AD_ADD_CONSTRAINT_DEFERRABLE |
85 : * SQL_AD_ADD_CONSTRAINT_INITIALLY_DEFERRED |
86 : * SQL_AD_ADD_CONSTRAINT_INITIALLY_IMMEDIATE |
87 : * SQL_AD_ADD_CONSTRAINT_NON_DEFERRABLE |
88 : * SQL_AD_ADD_DOMAIN_CONSTRAINT |
89 : * SQL_AD_ADD_DOMAIN_DEFAULT |
90 : * SQL_AD_CONSTRAINT_NAME_DEFINITION |
91 : * SQL_AD_DROP_DOMAIN_CONSTRAINT |
92 : * SQL_AD_DROP_DOMAIN_DEFAULT */
93 : break;
94 1 : case SQL_ALTER_TABLE:
95 1 : nValue = SQL_AT_ADD_COLUMN | /* ODBC 2.0, deprecated value */
96 : SQL_AT_ADD_COLUMN_DEFAULT |
97 : SQL_AT_ADD_COLUMN_SINGLE |
98 : SQL_AT_ADD_CONSTRAINT |
99 : SQL_AT_ADD_TABLE_CONSTRAINT |
100 : SQL_AT_CONSTRAINT_NAME_DEFINITION |
101 : SQL_AT_DROP_COLUMN | /* ODBC 2.0, deprecated value */
102 : SQL_AT_DROP_COLUMN_CASCADE |
103 : SQL_AT_DROP_COLUMN_DEFAULT |
104 : SQL_AT_DROP_COLUMN_RESTRICT |
105 : SQL_AT_DROP_TABLE_CONSTRAINT_CASCADE |
106 : SQL_AT_DROP_TABLE_CONSTRAINT_RESTRICT |
107 : SQL_AT_SET_COLUMN_DEFAULT;
108 : /* SQL_AT_ADD_COLUMN_COLLATION |
109 : * SQL_AT_CONSTRAINT_DEFERRABLE |
110 : * SQL_AT_CONSTRAINT_INITIALLY_DEFERRED |
111 : * SQL_AT_CONSTRAINT_INITIALLY_IMMEDIATE |
112 : * SQL_AT_CONSTRAINT_NON_DEFERRABLE */
113 1 : break;
114 : #ifdef SQL_ASYNC_DBC_FUNCTIONS
115 : case SQL_ASYNC_DBC_FUNCTIONS:
116 : nValue = SQL_ASYNC_DBC_NOT_CAPABLE;
117 : /* SQL_ASYNC_DBC_CAPABLE */
118 : break;
119 : #endif
120 : case SQL_ASYNC_MODE:
121 : nValue = SQL_AM_NONE;
122 : /* SQL_AM_CONNECTION, SQL_AM_STATEMENT */
123 : break;
124 : #ifdef SQL_ASYNC_NOTIFICATION
125 : case SQL_ASYNC_NOTIFICATION:
126 : nValue = SQL_ASYNC_NOTIFICATION_NOT_CAPABLE;
127 : /* SQL_ASYNC_NOTIFICATION_CAPABLE */
128 : break;
129 : #endif
130 1 : case SQL_BATCH_ROW_COUNT:
131 1 : nValue = SQL_BRC_EXPLICIT;
132 : /* SQL_BRC_PROCEDURES | SQL_BRC_ROLLED_UP */
133 1 : break;
134 : case SQL_BATCH_SUPPORT:
135 5 : nValue = SQL_BS_ROW_COUNT_EXPLICIT | SQL_BS_SELECT_EXPLICIT;
136 : /* SQL_BS_ROW_COUNT_PROC |
137 : * SQL_BS_SELECT_PROC */
138 : break;
139 : case SQL_BOOKMARK_PERSISTENCE:
140 : /* SQL_BP_CLOSE |
141 : * SQL_BP_DELETE |
142 : * SQL_BP_DROP |
143 : * SQL_BP_OTHER_HSTMT |
144 : * SQL_BP_TRANSACTION |
145 : * SQL_BP_UPDATE */
146 : break;
147 1 : case SQL_CATALOG_LOCATION:
148 : /* SQL_CL_END, SQL_CL_START */
149 1 : len = sizeof(SQLUSMALLINT);
150 1 : break;
151 1 : case SQL_CATALOG_NAME:
152 1 : sValue = "N"; /* "Y" */
153 1 : break;
154 2 : case SQL_CATALOG_NAME_SEPARATOR:
155 : case SQL_CATALOG_TERM:
156 2 : sValue = "";
157 2 : break;
158 : case SQL_CATALOG_USAGE:
159 : /* SQL_CU_DML_STATEMENTS |
160 : * SQL_CU_INDEX_DEFINITION |
161 : * SQL_CU_PRIVILEGE_DEFINITION |
162 : * SQL_CU_PROCEDURE_INVOCATION |
163 : * SQL_CU_TABLE_DEFINITION */
164 : break;
165 1 : case SQL_COLLATION_SEQ:
166 1 : sValue = "UTF-8";
167 1 : break;
168 1 : case SQL_COLUMN_ALIAS:
169 1 : sValue = "Y"; /* "N" */
170 1 : break;
171 1 : case SQL_CONCAT_NULL_BEHAVIOR:
172 1 : nValue = SQL_CB_NULL;
173 : /* SQL_CB_NON_NULL */
174 1 : len = sizeof(SQLUSMALLINT);
175 1 : break;
176 4 : case SQL_CONVERT_TINYINT:
177 : case SQL_CONVERT_SMALLINT:
178 : case SQL_CONVERT_INTEGER:
179 : case SQL_CONVERT_BIGINT:
180 4 : nValue = SQL_CVT_BIGINT |
181 : SQL_CVT_BIT |
182 : SQL_CVT_CHAR |
183 : SQL_CVT_DECIMAL |
184 : SQL_CVT_DOUBLE |
185 : SQL_CVT_FLOAT |
186 : SQL_CVT_INTEGER |
187 : SQL_CVT_INTERVAL_DAY_TIME |
188 : SQL_CVT_INTERVAL_YEAR_MONTH |
189 : SQL_CVT_LONGVARCHAR |
190 : SQL_CVT_NUMERIC |
191 : SQL_CVT_REAL |
192 : SQL_CVT_SMALLINT |
193 : SQL_CVT_TINYINT |
194 : SQL_CVT_VARCHAR;
195 4 : break;
196 3 : case SQL_CONVERT_BINARY:
197 : case SQL_CONVERT_LONGVARBINARY:
198 : case SQL_CONVERT_VARBINARY:
199 3 : nValue = SQL_CVT_BINARY |
200 : SQL_CVT_CHAR |
201 : SQL_CVT_LONGVARBINARY |
202 : SQL_CVT_LONGVARCHAR |
203 : SQL_CVT_VARBINARY |
204 : SQL_CVT_VARCHAR;
205 : /* SQL_CVT_GUID */
206 3 : break;
207 1 : case SQL_CONVERT_BIT:
208 1 : nValue = SQL_CVT_BIGINT |
209 : SQL_CVT_BIT |
210 : SQL_CVT_CHAR |
211 : SQL_CVT_INTEGER |
212 : SQL_CVT_LONGVARCHAR |
213 : SQL_CVT_SMALLINT |
214 : SQL_CVT_TINYINT |
215 : SQL_CVT_VARCHAR;
216 1 : break;
217 3 : case SQL_CONVERT_CHAR:
218 : case SQL_CONVERT_VARCHAR:
219 : case SQL_CONVERT_LONGVARCHAR:
220 3 : nValue = SQL_CVT_BIGINT |
221 : SQL_CVT_BINARY |
222 : SQL_CVT_BIT |
223 : SQL_CVT_CHAR |
224 : SQL_CVT_DATE |
225 : SQL_CVT_DECIMAL |
226 : SQL_CVT_DOUBLE |
227 : SQL_CVT_FLOAT |
228 : SQL_CVT_GUID |
229 : SQL_CVT_INTEGER |
230 : SQL_CVT_INTERVAL_DAY_TIME |
231 : SQL_CVT_INTERVAL_YEAR_MONTH |
232 : SQL_CVT_LONGVARBINARY |
233 : SQL_CVT_LONGVARCHAR |
234 : SQL_CVT_NUMERIC |
235 : SQL_CVT_REAL |
236 : SQL_CVT_SMALLINT |
237 : SQL_CVT_TIME |
238 : SQL_CVT_TIMESTAMP |
239 : SQL_CVT_TINYINT |
240 : SQL_CVT_VARBINARY |
241 : SQL_CVT_VARCHAR;
242 3 : break;
243 1 : case SQL_CONVERT_DATE:
244 1 : nValue = SQL_CVT_CHAR |
245 : SQL_CVT_DATE |
246 : SQL_CVT_LONGVARCHAR |
247 : SQL_CVT_TIMESTAMP |
248 : SQL_CVT_VARCHAR;
249 1 : break;
250 2 : case SQL_CONVERT_DECIMAL:
251 : case SQL_CONVERT_NUMERIC:
252 2 : nValue = SQL_CVT_BIGINT |
253 : SQL_CVT_CHAR |
254 : SQL_CVT_DECIMAL |
255 : SQL_CVT_DOUBLE |
256 : SQL_CVT_FLOAT |
257 : SQL_CVT_INTEGER |
258 : SQL_CVT_INTERVAL_DAY_TIME |
259 : SQL_CVT_LONGVARCHAR |
260 : SQL_CVT_NUMERIC |
261 : SQL_CVT_REAL |
262 : SQL_CVT_SMALLINT |
263 : SQL_CVT_TINYINT |
264 : SQL_CVT_VARCHAR;
265 2 : break;
266 3 : case SQL_CONVERT_DOUBLE:
267 : case SQL_CONVERT_REAL:
268 : case SQL_CONVERT_FLOAT:
269 3 : nValue = SQL_CVT_BIGINT |
270 : SQL_CVT_CHAR |
271 : SQL_CVT_DECIMAL |
272 : SQL_CVT_DOUBLE |
273 : SQL_CVT_FLOAT |
274 : SQL_CVT_INTEGER |
275 : SQL_CVT_LONGVARCHAR |
276 : SQL_CVT_NUMERIC |
277 : SQL_CVT_REAL |
278 : SQL_CVT_SMALLINT |
279 : SQL_CVT_TINYINT |
280 : SQL_CVT_VARCHAR;
281 3 : break;
282 1 : case SQL_CONVERT_INTERVAL_DAY_TIME:
283 1 : nValue = SQL_CVT_BIGINT |
284 : SQL_CVT_CHAR |
285 : SQL_CVT_INTEGER |
286 : SQL_CVT_INTERVAL_DAY_TIME |
287 : SQL_CVT_LONGVARCHAR |
288 : SQL_CVT_SMALLINT |
289 : SQL_CVT_TIME |
290 : SQL_CVT_TINYINT |
291 : SQL_CVT_VARCHAR;
292 1 : break;
293 1 : case SQL_CONVERT_INTERVAL_YEAR_MONTH:
294 1 : nValue = SQL_CVT_BIGINT |
295 : SQL_CVT_CHAR |
296 : SQL_CVT_INTEGER |
297 : SQL_CVT_INTERVAL_YEAR_MONTH |
298 : SQL_CVT_LONGVARCHAR |
299 : SQL_CVT_SMALLINT |
300 : SQL_CVT_TINYINT |
301 : SQL_CVT_VARCHAR;
302 1 : break;
303 1 : case SQL_CONVERT_TIME:
304 1 : nValue = SQL_CVT_CHAR |
305 : SQL_CVT_INTERVAL_DAY_TIME |
306 : SQL_CVT_LONGVARCHAR |
307 : SQL_CVT_TIME |
308 : SQL_CVT_VARCHAR;
309 1 : break;
310 1 : case SQL_CONVERT_TIMESTAMP:
311 1 : nValue = SQL_CVT_CHAR |
312 : SQL_CVT_DATE |
313 : SQL_CVT_LONGVARCHAR |
314 : SQL_CVT_TIME |
315 : SQL_CVT_TIMESTAMP |
316 : SQL_CVT_VARCHAR;
317 1 : break;
318 0 : case SQL_CONVERT_GUID:
319 0 : nValue =SQL_CVT_CHAR |
320 : SQL_CVT_GUID |
321 : SQL_CVT_LONGVARCHAR |
322 : SQL_CVT_VARCHAR;
323 0 : break;
324 : case SQL_CONVERT_FUNCTIONS:
325 5 : nValue = SQL_FN_CVT_CAST | SQL_FN_CVT_CONVERT;
326 : break;
327 : case SQL_CORRELATION_NAME:
328 3 : nValue = SQL_CN_ANY;
329 : /* SQL_CN_DIFFERENT, SQL_CN_NONE */
330 3 : len = sizeof(SQLUSMALLINT);
331 : break;
332 : case SQL_CREATE_ASSERTION:
333 : /* SQL_CA_CREATE_ASSERTION |
334 : * SQL_CA_CONSTRAINT_DEFERRABLE |
335 : * SQL_CA_CONSTRAINT_INITIALLY_DEFERRED |
336 : * SQL_CA_CONSTRAINT_INITIALLY_IMMEDIATE |
337 : * SQL_CA_CONSTRAINT_NON_DEFERRABLE */
338 : case SQL_CREATE_CHARACTER_SET:
339 : /* SQL_CCS_CREATE_CHARACTER_SET |
340 : * SQL_CCS_COLLATE_CLAUSE |
341 : * SQL_CCS_LIMITED_COLLATION */
342 : case SQL_CREATE_COLLATION:
343 : /* SQL_CCOL_CREATE_COLLATION */
344 : case SQL_CREATE_DOMAIN:
345 : /* SQL_CDO_CREATE_DOMAIN |
346 : * SQL_CDO_CONSTRAINT_NAME_DEFINITION |
347 : * SQL_CDO_DEFAULT |
348 : * SQL_CDO_CONSTRAINT |
349 : * SQL_CDO_COLLATION |
350 : * SQL_CDO_CONSTRAINT_DEFERRABLE |
351 : * SQL_CDO_CONSTRAINT_INITIALLY_DEFERRED |
352 : * SQL_CDO_CONSTRAINT_INITIALLY_IMMEDIATE |
353 : * SQL_CDO_CONSTRAINT_NON_DEFERRABLE */
354 : case SQL_CREATE_TRANSLATION:
355 : /* SQL_CTR_CREATE_TRANSLATION */
356 : break;
357 : case SQL_CREATE_SCHEMA:
358 5 : nValue = SQL_CS_CREATE_SCHEMA | SQL_CS_AUTHORIZATION;
359 : /* SQL_CS_DEFAULT_CHARACTER_SET */
360 : break;
361 1 : case SQL_CREATE_TABLE:
362 1 : nValue = SQL_CT_COLUMN_CONSTRAINT |
363 : SQL_CT_COLUMN_DEFAULT |
364 : SQL_CT_COMMIT_DELETE |
365 : SQL_CT_COMMIT_PRESERVE |
366 : SQL_CT_CONSTRAINT_NAME_DEFINITION |
367 : SQL_CT_CREATE_TABLE |
368 : SQL_CT_GLOBAL_TEMPORARY |
369 : SQL_CT_LOCAL_TEMPORARY |
370 : SQL_CT_TABLE_CONSTRAINT;
371 : /* SQL_CT_COLUMN_COLLATION |
372 : * SQL_CT_CONSTRAINT_DEFERRABLE |
373 : * SQL_CT_CONSTRAINT_INITIALLY_DEFERRED |
374 : * SQL_CT_CONSTRAINT_INITIALLY_IMMEDIATE |
375 : * SQL_CT_CONSTRAINT_NON_DEFERRABLE */
376 1 : break;
377 : case SQL_CREATE_VIEW:
378 5 : nValue = SQL_CV_CREATE_VIEW | SQL_CV_CHECK_OPTION;
379 : /* SQL_CV_CASCADE | SQL_CV_LOCAL */
380 : break;
381 6 : case SQL_CURSOR_COMMIT_BEHAVIOR:
382 : case SQL_CURSOR_ROLLBACK_BEHAVIOR:
383 6 : nValue = SQL_CB_DELETE;
384 : /* SQL_CB_CLOSE, SQL_CB_DELETE, SQL_CB_PRESERVE */
385 6 : len = sizeof(SQLUSMALLINT);
386 6 : break;
387 1 : case SQL_CURSOR_SENSITIVITY:
388 1 : nValue = SQL_INSENSITIVE;
389 : /* SQL_SENSITIVE, SQL_UNSPECIFIED */
390 1 : break;
391 0 : case SQL_DATA_SOURCE_NAME:
392 0 : sValue = dbc->dsn ? dbc->dsn : "";
393 : break;
394 1 : case SQL_DATA_SOURCE_READ_ONLY:
395 1 : sValue = "N"; /* "Y" */
396 1 : break;
397 1 : case SQL_DATABASE_NAME:
398 1 : sValue = dbc->dbname ? dbc->dbname : "";
399 : break;
400 1 : case SQL_DATETIME_LITERALS:
401 1 : nValue = SQL_DL_SQL92_DATE |
402 : SQL_DL_SQL92_TIME |
403 : SQL_DL_SQL92_TIMESTAMP |
404 : SQL_DL_SQL92_INTERVAL_YEAR |
405 : SQL_DL_SQL92_INTERVAL_MONTH |
406 : SQL_DL_SQL92_INTERVAL_DAY |
407 : SQL_DL_SQL92_INTERVAL_HOUR |
408 : SQL_DL_SQL92_INTERVAL_MINUTE |
409 : SQL_DL_SQL92_INTERVAL_SECOND |
410 : SQL_DL_SQL92_INTERVAL_YEAR_TO_MONTH |
411 : SQL_DL_SQL92_INTERVAL_DAY_TO_HOUR |
412 : SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTE |
413 : SQL_DL_SQL92_INTERVAL_DAY_TO_SECOND |
414 : SQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTE |
415 : SQL_DL_SQL92_INTERVAL_HOUR_TO_SECOND |
416 : SQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND;
417 1 : len = sizeof(SQLINTEGER);
418 1 : break;
419 1 : case SQL_DBMS_NAME:
420 1 : sValue = "MonetDB";
421 1 : break;
422 1 : case SQL_DBMS_VER:
423 1 : snprintf(buf, sizeof(buf), "%02d.%02d.%04d",
424 1 : dbc->major, dbc->minor, dbc->patch);
425 1 : sValue = buf;
426 1 : break;
427 : case SQL_DDL_INDEX:
428 5 : nValue = SQL_DI_CREATE_INDEX | SQL_DI_DROP_INDEX;
429 : break;
430 : case SQL_DEFAULT_TXN_ISOLATION:
431 3 : nValue = SQL_TXN_SERIALIZABLE;
432 : break;
433 2 : case SQL_DESCRIBE_PARAMETER:
434 2 : sValue = "N"; /* "Y" */
435 2 : break;
436 : #ifdef SQL_DRIVER_AWARE_POOLING_SUPPORTED
437 : case SQL_DRIVER_AWARE_POOLING_SUPPORTED:
438 : nValue = SQL_DRIVER_AWARE_POOLING_NOT_CAPABLE;
439 : /* SQL_DRIVER_AWARE_POOLING_CAPABLE */
440 : break;
441 : #endif
442 1 : case SQL_DRIVER_NAME:
443 1 : sValue = MONETDB_DRIVER_NAME;
444 1 : break;
445 2 : case SQL_DRIVER_ODBC_VER:
446 2 : sValue = MONETDB_ODBC_VER;
447 2 : break;
448 1 : case SQL_DRIVER_VER:
449 1 : snprintf(buf, sizeof(buf), "%02d.%02d.%04d %s",
450 : MONETDB_VERSION_MAJOR, MONETDB_VERSION_MINOR,
451 : MONETDB_VERSION_PATCH,
452 : #ifdef MONETDB_RELEASE
453 : MONETDB_RELEASE
454 : #else
455 : "unreleased"
456 : #endif
457 : );
458 1 : sValue = buf;
459 1 : break;
460 : case SQL_DROP_ASSERTION:
461 : /* SQL_DA_DROP_ASSERION */
462 : break;
463 : case SQL_DROP_CHARACTER_SET:
464 : /* SQL_DCS_DROP_CHARACTER_SET */
465 : break;
466 : case SQL_DROP_COLLATION:
467 : /* SQL_DC_DROP_COLLATION */
468 : break;
469 : case SQL_DROP_DOMAIN:
470 : /* SQL_DD_DROP_DOMAIN | SQL_DD_CASCADE | SQL_DD_RESTRICT */
471 : break;
472 : case SQL_DROP_SCHEMA:
473 8 : nValue = SQL_DS_DROP_SCHEMA | SQL_DS_CASCADE | SQL_DS_RESTRICT;
474 : break;
475 : case SQL_DROP_TABLE:
476 8 : nValue = SQL_DT_DROP_TABLE | SQL_DT_CASCADE | SQL_DT_RESTRICT;
477 : break;
478 : case SQL_DROP_TRANSLATION:
479 : /* SQL_DTR_DROP_TRANSLATION */
480 : break;
481 : case SQL_DROP_VIEW:
482 8 : nValue = SQL_DV_DROP_VIEW | SQL_DV_CASCADE | SQL_DV_RESTRICT;
483 : break;
484 : case SQL_DYNAMIC_CURSOR_ATTRIBUTES1:
485 8 : nValue = SQL_CA1_ABSOLUTE | SQL_CA1_NEXT | SQL_CA1_RELATIVE;
486 : /* SQL_CA1_BOOKMARK |
487 : * SQL_CA1_BULK_ADD |
488 : * SQL_CA1_BULK_DELETE_BY_BOOKMARK |
489 : * SQL_CA1_BULK_FETCH_BY_BOOKMARK |
490 : * SQL_CA1_BULK_UPDATE_BY_BOOKMARK |
491 : * SQL_CA1_LOCK_EXCLUSIVE |
492 : * SQL_CA1_LOCK_NO_CHANGE |
493 : * SQL_CA1_LOCK_UNLOCK |
494 : * SQL_CA1_POS_DELETE |
495 : * SQL_CA1_POSITIONED_DELETE |
496 : * SQL_CA1_POSITIONED_UPDATE |
497 : * SQL_CA1_POS_POSITION |
498 : * SQL_CA1_POS_REFRESH |
499 : * SQL_CA1_POS_UPDATE |
500 : * SQL_CA1_SELECT_FOR_UPDATE */
501 : break;
502 : case SQL_DYNAMIC_CURSOR_ATTRIBUTES2:
503 : /* SQL_CA2_CRC_APPROXIMATE |
504 : * SQL_CA2_CRC_EXACT |
505 : * SQL_CA2_LOCK_CONCURRENCY |
506 : * SQL_CA2_MAX_ROWS_AFFECTS_ALL |
507 : * SQL_CA2_MAX_ROWS_CATALOG |
508 : * SQL_CA2_MAX_ROWS_DELETE |
509 : * SQL_CA2_MAX_ROWS_INSERT |
510 : * SQL_CA2_MAX_ROWS_SELECT |
511 : * SQL_CA2_MAX_ROWS_UPDATE |
512 : * SQL_CA2_OPT_ROWVER_CONCURRENCY |
513 : * SQL_CA2_OPT_VALUES_CONCURRENCY |
514 : * SQL_CA2_READ_ONLY_CONCURRENCY |
515 : * SQL_CA2_SENSITIVITY_ADDITIONS |
516 : * SQL_CA2_SENSITIVITY_DELETIONS |
517 : * SQL_CA2_SENSITIVITY_UPDATES |
518 : * SQL_CA2_SIMULATE_NON_UNIQUE |
519 : * SQL_CA2_SIMULATE_TRY_UNIQUE |
520 : * SQL_CA2_SIMULATE_UNIQUE */
521 : break;
522 1 : case SQL_EXPRESSIONS_IN_ORDERBY:
523 1 : sValue = "Y"; /* "N" */
524 1 : break;
525 1 : case SQL_FILE_USAGE:
526 1 : nValue = SQL_FILE_NOT_SUPPORTED;
527 : /* SQL_FILE_TABLE, SQL_FILE_CATALOG */
528 1 : len = sizeof(SQLUSMALLINT);
529 1 : break;
530 : case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1:
531 1 : nValue = SQL_CA1_NEXT;
532 : /* SQL_CA1_BULK_ADD |
533 : * SQL_CA1_BULK_DELETE_BY_BOOKMARK |
534 : * SQL_CA1_BULK_FETCH_BY_BOOKMARK |
535 : * SQL_CA1_BULK_UPDATE_BY_BOOKMARK |
536 : * SQL_CA1_LOCK_EXCLUSIVE |
537 : * SQL_CA1_LOCK_NO_CHANGE |
538 : * SQL_CA1_LOCK_UNLOCK |
539 : * SQL_CA1_POS_DELETE |
540 : * SQL_CA1_POSITIONED_DELETE |
541 : * SQL_CA1_POSITIONED_UPDATE |
542 : * SQL_CA1_POS_POSITION |
543 : * SQL_CA1_POS_REFRESH |
544 : * SQL_CA1_POS_UPDATE |
545 : * SQL_CA1_SELECT_FOR_UPDATE */
546 : break;
547 : case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2:
548 : /* SQL_CA2_CRC_APPROXIMATE |
549 : * SQL_CA2_CRC_EXACT |
550 : * SQL_CA2_LOCK_CONCURRENCY |
551 : * SQL_CA2_MAX_ROWS_AFFECTS_ALL |
552 : * SQL_CA2_MAX_ROWS_CATALOG |
553 : * SQL_CA2_MAX_ROWS_DELETE |
554 : * SQL_CA2_MAX_ROWS_INSERT |
555 : * SQL_CA2_MAX_ROWS_SELECT |
556 : * SQL_CA2_MAX_ROWS_UPDATE |
557 : * SQL_CA2_OPT_ROWVER_CONCURRENCY |
558 : * SQL_CA2_OPT_VALUES_CONCURRENCY |
559 : * SQL_CA2_READ_ONLY_CONCURRENCY |
560 : * SQL_CA2_SENSITIVITY_ADDITIONS |
561 : * SQL_CA2_SENSITIVITY_DELETIONS |
562 : * SQL_CA2_SENSITIVITY_UPDATES |
563 : * SQL_CA2_SIMULATE_NON_UNIQUE |
564 : * SQL_CA2_SIMULATE_TRY_UNIQUE |
565 : * SQL_CA2_SIMULATE_UNIQUE */
566 : break;
567 : case SQL_GETDATA_EXTENSIONS:
568 5 : nValue = SQL_GD_ANY_COLUMN |
569 : SQL_GD_ANY_ORDER |
570 : SQL_GD_BLOCK |
571 : SQL_GD_BOUND;
572 : /* SQL_GD_OUTPUT_PARAMS */
573 : break;
574 1 : case SQL_GROUP_BY:
575 1 : nValue = SQL_GB_NO_RELATION;
576 : /* SQL_GB_COLLATE, SQL_GB_NOT_SUPPORTED,
577 : * SQL_GB_BROUP_BY_EQUALS_SELECT,
578 : * SQL_GB_GROUP_BY_CONTAINS_SELECT */
579 1 : len = sizeof(SQLUSMALLINT);
580 1 : break;
581 : case SQL_IDENTIFIER_CASE:
582 3 : nValue = SQL_IC_LOWER;
583 : /* SQL_IC_UPPER, SQL_IC_SENSITIVE, SQL_IC_MIXED */
584 3 : len = sizeof(SQLUSMALLINT);
585 : break;
586 1 : case SQL_IDENTIFIER_QUOTE_CHAR:
587 1 : sValue = "\""; /* the " (double quote) */
588 1 : break;
589 : case SQL_INDEX_KEYWORDS:
590 : nValue = SQL_IK_NONE;
591 : /* SQL_IK_ASC | SQL_IK_DESC | SQL_IK_ALL */
592 : break;
593 1 : case SQL_INFO_SCHEMA_VIEWS:
594 1 : nValue = SQL_ISV_CHARACTER_SETS |
595 : SQL_ISV_CHECK_CONSTRAINTS |
596 : SQL_ISV_COLUMNS |
597 : SQL_ISV_REFERENTIAL_CONSTRAINTS |
598 : SQL_ISV_SCHEMATA |
599 : SQL_ISV_TABLE_CONSTRAINTS |
600 : SQL_ISV_TABLES |
601 : SQL_ISV_VIEWS;
602 : /* SQL_ISV_ASSERTIONS |
603 : * SQL_ISV_COLLATIONS |
604 : * SQL_ISV_COLUMN_DOMAIN_USAGE |
605 : * SQL_ISV_COLUMN_PRIVILEGES |
606 : * SQL_ISV_CONSTRAINT_COLUMN_USAGE |
607 : * SQL_ISV_CONSTRAINT_TABLE_USAGE |
608 : * SQL_ISV_DOMAIN_CONSTRAINTS |
609 : * SQL_ISV_DOMAINS |
610 : * SQL_ISV_KEY_COLUMN_USAGE |
611 : * SQL_ISV_SQL_LANGUAGES |
612 : * SQL_ISV_TABLE_PRIVILEGES |
613 : * SQL_ISV_TRANSLATIONS |
614 : * SQL_ISV_USAGE_PRIVILEGES |
615 : * SQL_ISV_VIEW_COLUMN_USAGE |
616 : * SQL_ISV_VIEW_TABLE_USAGE */
617 1 : break;
618 : case SQL_INSERT_STATEMENT:
619 8 : nValue = SQL_IS_INSERT_LITERALS |
620 : SQL_IS_INSERT_SEARCHED |
621 : SQL_IS_SELECT_INTO;
622 : break;
623 1 : case SQL_INTEGRITY:
624 : /* N because we currently do not supprt CHECK constraints (see bug 3568) nor deferrable FK constraints. */
625 1 : sValue = "N"; /* "Y" */
626 1 : break;
627 : case SQL_KEYSET_CURSOR_ATTRIBUTES1:
628 : /* SQL_CA1_ABSOLUTE |
629 : * SQL_CA1_BOOKMARK |
630 : * SQL_CA1_BULK_ADD |
631 : * SQL_CA1_BULK_DELETE_BY_BOOKMARK |
632 : * SQL_CA1_BULK_FETCH_BY_BOOKMARK |
633 : * SQL_CA1_BULK_UPDATE_BY_BOOKMARK |
634 : * SQL_CA1_LOCK_EXCLUSIVE |
635 : * SQL_CA1_LOCK_NO_CHANGE |
636 : * SQL_CA1_LOCK_UNLOCK |
637 : * SQL_CA1_NEXT |
638 : * SQL_CA1_POS_DELETE |
639 : * SQL_CA1_POSITIONED_DELETE |
640 : * SQL_CA1_POSITIONED_UPDATE |
641 : * SQL_CA1_POS_POSITION |
642 : * SQL_CA1_POS_REFRESH |
643 : * SQL_CA1_POS_UPDATE |
644 : * SQL_CA1_RELATIVE |
645 : * SQL_CA1_SELECT_FOR_UPDATE */
646 : break;
647 : case SQL_KEYSET_CURSOR_ATTRIBUTES2:
648 : /* SQL_CA2_CRC_APPROXIMATE |
649 : * SQL_CA2_CRC_EXACT |
650 : * SQL_CA2_LOCK_CONCURRENCY |
651 : * SQL_CA2_MAX_ROWS_AFFECTS_ALL |
652 : * SQL_CA2_MAX_ROWS_CATALOG |
653 : * SQL_CA2_MAX_ROWS_DELETE |
654 : * SQL_CA2_MAX_ROWS_INSERT |
655 : * SQL_CA2_MAX_ROWS_SELECT |
656 : * SQL_CA2_MAX_ROWS_UPDATE |
657 : * SQL_CA2_OPT_ROWVER_CONCURRENCY |
658 : * SQL_CA2_OPT_VALUES_CONCURRENCY |
659 : * SQL_CA2_READ_ONLY_CONCURRENCY |
660 : * SQL_CA2_SENSITIVITY_ADDITIONS |
661 : * SQL_CA2_SENSITIVITY_DELETIONS |
662 : * SQL_CA2_SENSITIVITY_UPDATES |
663 : * SQL_CA2_SIMULATE_NON_UNIQUE |
664 : * SQL_CA2_SIMULATE_TRY_UNIQUE |
665 : * SQL_CA2_SIMULATE_UNIQUE */
666 : break;
667 1 : case SQL_KEYWORDS:
668 : /* A character string that contains a comma-separated list of all data source-specific keywords.
669 : * This list does not contain keywords specific to ODBC or keywords used by both the data source and ODBC.
670 : * This list represents all the reserved keywords; interoperable applications should not use these words in object names.
671 : * Returns the MonetDB sys.keywords minus the ODBC keywords: https://learn.microsoft.com/en-us/sql/odbc/reference/appendixes/reserved-keywords */
672 1 : hdl = mapi_query(dbc->mid,
673 : "WITH x(k) AS (SELECT keyword FROM sys.keywords WHERE keyword NOT IN ("
674 : "'ABSOLUTE','ACTION','ADA','ADD','ALL','ALLOCATE','ALTER','AND','ANY',"
675 : "'ARE','AS','ASC','ASSERTION','AT','AUTHORIZATION','AVG',"
676 : "'BEGIN','BETWEEN','BIT','BIT_LENGTH','BOTH','BY',"
677 : "'CASCADE','CASCADED','CASE','CAST','CATALOG','CHAR','CHAR_LENGTH',"
678 : "'CHARACTER','CHARACTER_LENGTH','CHECK','CLOSE','COALESCE',"
679 : "'COLLATE','COLLATION','COLUMN','COMMIT','CONNECT','CONNECTION','CONSTRAINT',"
680 : "'CONSTRAINTS','CONTINUE','CONVERT','CORRESPONDING','COUNT','CREATE','CROSS',"
681 : "'CURRENT','CURRENT_DATE','CURRENT_TIME','CURRENT_TIMESTAMP','CURRENT_USER','CURSOR',"
682 : "'DATE','DAY','DEALLOCATE','DEC','DECIMAL','DECLARE','DEFAULT','DEFERRABLE',"
683 : "'DEFERRED','DELETE','DESC','DESCRIBE','DESCRIPTOR','DIAGNOSTICS','DISCONNECT',"
684 : "'DISTINCT','DOMAIN','DOUBLE','DROP',"
685 : "'ELSE','END','END-EXEC','ESCAPE','EXCEPT','EXCEPTION','EXEC','EXECUTE',"
686 : "'EXISTS','EXTERNAL','EXTRACT',"
687 : "'FALSE','FETCH','FIRST','FLOAT','FOR','FOREIGN','FORTRAN','FOUND','FROM','FULL',"
688 : "'GET','GLOBAL','GO','GOTO','GRANT','GROUP','HAVING','HOUR',"
689 : "'IDENTITY','IMMEDIATE','IN','INCLUDE','INDEX','INDICATOR','INITIALLY','INNER','INPUT',"
690 : "'INSENSITIVE','INSERT','INT','INTEGER','INTERSECT','INTERVAL','INTO','IS','ISOLATION',"
691 : "'JOIN','KEY','LANGUAGE','LAST','LEADING','LEFT','LEVEL','LIKE','LOCAL','LOWER',"
692 : "'MATCH','MAX','MIN','MINUTE','MODULE','MONTH',"
693 : "'NAMES','NATIONAL','NATURAL','NCHAR','NEXT','NO','NONE','NOT','NULL','NULLIF','NUMERIC',"
694 : "'OCTET_LENGTH','OF','ON','ONLY','OPEN','OPTION','OR','ORDER','OUTER','OUTPUT','OVERLAPS',"
695 : "'PAD','PARTIAL','PASCAL','PLI','POSITION','PRECISION','PREPARE','PRESERVE',"
696 : "'PRIMARY','PRIOR','PRIVILEGES','PROCEDURE','PUBLIC',"
697 : "'READ','REAL','REFERENCES','RELATIVE','RESTRICT','REVOKE','RIGHT','ROLLBACK','ROWS',"
698 : "'SCHEMA','SCROLL','SECOND','SECTION','SELECT','SESSION','SESSION_USER','SET',"
699 : "'SIZE','SMALLINT','SOME','SPACE','SQL','SQLCA','SQLCODE','SQLERROR',"
700 : "'SQLSTATE','SQLWARNING','SUBSTRING','SUM','SYSTEM_USER',"
701 : "'TABLE','TEMPORARY','THEN','TIME','TIMESTAMP','TIMEZONE_HOUR','TIMEZONE_MINUTE',"
702 : "'TO','TRAILING','TRANSACTION','TRANSLATE','TRANSLATION','TRIM','TRUE',"
703 : "'UNION','UNIQUE','UNKNOWN','UPDATE','UPPER','USAGE','USER','USING',"
704 : "'VALUE','VALUES','VARCHAR','VARYING','VIEW',"
705 : "'WHEN','WHENEVER','WHERE','WITH','WORK','WRITE',"
706 : "'YEAR','ZONE') ORDER BY keyword) SELECT group_concat(k, ',') FROM x");
707 1 : if (hdl != NULL && mapi_fetch_row(hdl)) {
708 1 : sValue = mapi_fetch_field(hdl, 0);
709 : } else {
710 0 : addDbcError(dbc, mapi_error(dbc->mid) == MTIMEOUT ? "HYT01" : "HY000", NULL, 0);
711 : }
712 : break;
713 1 : case SQL_LIKE_ESCAPE_CLAUSE:
714 1 : sValue = "Y"; /* "N" */
715 1 : break;
716 : case SQL_MAX_ASYNC_CONCURRENT_STATEMENTS:
717 : break;
718 : case SQL_MAX_BINARY_LITERAL_LEN:
719 : break;
720 : case SQL_MAX_CATALOG_NAME_LEN:
721 7 : len = sizeof(SQLUSMALLINT);
722 : break;
723 : case SQL_MAX_CHAR_LITERAL_LEN:
724 : break;
725 : case SQL_MAX_COLUMN_NAME_LEN:
726 5 : nValue = 1024; /* max length of column sys._columns.name is defined as 1024 */
727 5 : len = sizeof(SQLUSMALLINT);
728 : break;
729 : case SQL_MAX_COLUMNS_IN_GROUP_BY:
730 : case SQL_MAX_COLUMNS_IN_INDEX:
731 : case SQL_MAX_COLUMNS_IN_ORDER_BY:
732 : case SQL_MAX_COLUMNS_IN_SELECT:
733 : case SQL_MAX_COLUMNS_IN_TABLE:
734 : case SQL_MAX_CONCURRENT_ACTIVITIES:
735 : case SQL_MAX_CURSOR_NAME_LEN:
736 7 : len = sizeof(SQLUSMALLINT);
737 : break;
738 1 : case SQL_MAX_DRIVER_CONNECTIONS:
739 1 : nValue = dbc->maxclients;
740 1 : len = sizeof(SQLUSMALLINT);
741 1 : break;
742 : case SQL_MAX_IDENTIFIER_LEN:
743 5 : nValue = 1024; /* max length of columns sys.*.name is defined as 1024 */
744 5 : len = sizeof(SQLUSMALLINT);
745 : break;
746 : case SQL_MAX_INDEX_SIZE:
747 : break;
748 1 : case SQL_MAX_PROCEDURE_NAME_LEN:
749 1 : nValue = 256; /* max length of column sys.functions.name is defined as 256 */
750 1 : len = sizeof(SQLUSMALLINT);
751 1 : break;
752 : case SQL_MAX_ROW_SIZE:
753 : break;
754 1 : case SQL_MAX_ROW_SIZE_INCLUDES_LONG:
755 1 : sValue = "Y"; /* "N" */
756 1 : break;
757 : case SQL_MAX_SCHEMA_NAME_LEN:
758 5 : nValue = 1024; /* max length of column sys.schemas.name is defined as 1024 */
759 5 : len = sizeof(SQLUSMALLINT);
760 : break;
761 : case SQL_MAX_STATEMENT_LEN:
762 : break;
763 : case SQL_MAX_TABLE_NAME_LEN:
764 5 : nValue = 1024; /* max length of column sys._tables.name is defined as 1024 */
765 5 : len = sizeof(SQLUSMALLINT);
766 : break;
767 1 : case SQL_MAX_TABLES_IN_SELECT:
768 1 : len = sizeof(SQLUSMALLINT);
769 1 : break;
770 : case SQL_MAX_USER_NAME_LEN:
771 5 : nValue = 1024; /* max length of sys.db_user_info.name is defined as 1024 */
772 5 : len = sizeof(SQLUSMALLINT);
773 : break;
774 : case SQL_MULT_RESULT_SETS:
775 2 : sValue = "Y"; /* "N" */
776 : break;
777 : case SQL_MULTIPLE_ACTIVE_TXN:
778 2 : sValue = "Y"; /* "N" */
779 : break;
780 : case SQL_NEED_LONG_DATA_LEN:
781 3 : sValue = "N"; /* "Y" */
782 : break;
783 : case SQL_NON_NULLABLE_COLUMNS:
784 2 : nValue = SQL_NNC_NON_NULL;
785 : /* SQL_NNC_NULL */
786 2 : len = sizeof(SQLUSMALLINT);
787 : break;
788 : case SQL_NULL_COLLATION:
789 2 : nValue = SQL_NC_LOW;
790 : /* SQL_NC_END, SQL_NC_HIGH, SQL_NC_START */
791 2 : len = sizeof(SQLUSMALLINT);
792 : break;
793 1 : case SQL_NUMERIC_FUNCTIONS:
794 1 : nValue = SQL_FN_NUM_ABS |
795 : SQL_FN_NUM_ACOS |
796 : SQL_FN_NUM_ASIN |
797 : SQL_FN_NUM_ATAN |
798 : SQL_FN_NUM_ATAN2 |
799 : SQL_FN_NUM_CEILING |
800 : SQL_FN_NUM_COS |
801 : SQL_FN_NUM_COT |
802 : SQL_FN_NUM_DEGREES |
803 : SQL_FN_NUM_EXP |
804 : SQL_FN_NUM_FLOOR |
805 : SQL_FN_NUM_LOG |
806 : SQL_FN_NUM_LOG10 |
807 : SQL_FN_NUM_MOD |
808 : SQL_FN_NUM_PI |
809 : SQL_FN_NUM_POWER |
810 : SQL_FN_NUM_RADIANS |
811 : SQL_FN_NUM_RAND |
812 : SQL_FN_NUM_ROUND |
813 : SQL_FN_NUM_SIGN |
814 : SQL_FN_NUM_SIN |
815 : SQL_FN_NUM_SQRT |
816 : SQL_FN_NUM_TAN |
817 : SQL_FN_NUM_TRUNCATE; /* is mapped to ms_trunc() */
818 1 : break;
819 : case SQL_ODBC_INTERFACE_CONFORMANCE:
820 2 : nValue = SQL_OIC_CORE;
821 : /* SQL_OIC_LEVEL1, SQL_OIC_LEVEL2 */
822 : break;
823 : case SQL_OJ_CAPABILITIES:
824 2 : nValue = SQL_OJ_LEFT |
825 : SQL_OJ_RIGHT |
826 : SQL_OJ_FULL |
827 : SQL_OJ_NESTED |
828 : SQL_OJ_NOT_ORDERED |
829 : SQL_OJ_INNER |
830 : SQL_OJ_ALL_COMPARISON_OPS;
831 : break;
832 : case SQL_ORDER_BY_COLUMNS_IN_SELECT:
833 3 : sValue = "N"; /* "Y" */
834 : break;
835 : case SQL_PARAM_ARRAY_ROW_COUNTS:
836 2 : nValue = SQL_PARC_BATCH; /* ? */
837 : /* SQL_PARC_NO_BATCH */
838 : break;
839 : case SQL_PARAM_ARRAY_SELECTS:
840 1 : nValue = SQL_PAS_NO_SELECT;
841 : /* SQL_PAS_BATCH, SQL_PAS_NO_BATCH */
842 : break;
843 1 : case SQL_PROCEDURE_TERM:
844 1 : sValue = "procedure";
845 1 : break;
846 1 : case SQL_PROCEDURES:
847 1 : sValue = "Y"; /* "N" */
848 1 : break;
849 1 : case SQL_QUOTED_IDENTIFIER_CASE:
850 1 : nValue = SQL_IC_SENSITIVE;
851 : /* SQL_IC_LOWER, SQL_IC_MIXED, SQL_IC_UPPER */
852 1 : len = sizeof(SQLUSMALLINT);
853 1 : break;
854 1 : case SQL_ROW_UPDATES:
855 1 : sValue = "N"; /* "Y" */
856 1 : break;
857 1 : case SQL_SCHEMA_TERM:
858 1 : sValue = "schema";
859 1 : break;
860 : case SQL_SCHEMA_USAGE:
861 2 : nValue = SQL_SU_DML_STATEMENTS |
862 : SQL_SU_PROCEDURE_INVOCATION |
863 : SQL_SU_TABLE_DEFINITION |
864 : SQL_SU_INDEX_DEFINITION |
865 : SQL_SU_PRIVILEGE_DEFINITION;
866 : break;
867 1 : case SQL_SCROLL_OPTIONS:
868 1 : nValue = SQL_SO_STATIC;
869 : /* SQL_SO_DYNAMIC,
870 : * SQL_SO_FORWARD_ONLY,
871 : * SQL_SO_KEYSET_DRIVEN,
872 : * SQL_SO_MIXED */
873 1 : break;
874 1 : case SQL_SEARCH_PATTERN_ESCAPE:
875 1 : sValue = "\\";
876 1 : break;
877 1 : case SQL_SERVER_NAME:
878 1 : sValue = MONETDB_SERVER_NAME;
879 1 : break;
880 1 : case SQL_SPECIAL_CHARACTERS:
881 1 : sValue = "!#$%&'()*+,-./:;<=>?@[]^`{|}~";
882 1 : break;
883 : case SQL_SQL_CONFORMANCE:
884 3 : nValue = SQL_SC_SQL92_FULL;
885 : break;
886 : case SQL_SQL92_DATETIME_FUNCTIONS:
887 8 : nValue = SQL_SDF_CURRENT_DATE |
888 : SQL_SDF_CURRENT_TIME |
889 : SQL_SDF_CURRENT_TIMESTAMP;
890 : break;
891 : case SQL_SQL92_FOREIGN_KEY_DELETE_RULE:
892 5 : nValue = SQL_SFKD_CASCADE |
893 : SQL_SFKD_NO_ACTION |
894 : SQL_SFKD_SET_DEFAULT |
895 : SQL_SFKD_SET_NULL;
896 : break;
897 : case SQL_SQL92_FOREIGN_KEY_UPDATE_RULE:
898 5 : nValue = SQL_SFKU_CASCADE |
899 : SQL_SFKU_NO_ACTION |
900 : SQL_SFKU_SET_DEFAULT |
901 : SQL_SFKU_SET_NULL;
902 : break;
903 1 : case SQL_SQL92_GRANT:
904 1 : nValue = SQL_SG_DELETE_TABLE |
905 : SQL_SG_INSERT_COLUMN |
906 : SQL_SG_INSERT_TABLE |
907 : SQL_SG_REFERENCES_COLUMN |
908 : SQL_SG_REFERENCES_TABLE |
909 : SQL_SG_SELECT_TABLE |
910 : SQL_SG_UPDATE_COLUMN |
911 : SQL_SG_UPDATE_TABLE |
912 : SQL_SG_WITH_GRANT_OPTION;
913 : /* SQL_SG_USAGE_ON_CHARACTER_SET |
914 : * SQL_SG_USAGE_ON_COLLATION |
915 : * SQL_SG_USAGE_ON_DOMAIN |
916 : * SQL_SG_USAGE_ON_TRANSLATION */
917 1 : break;
918 1 : case SQL_SQL92_NUMERIC_VALUE_FUNCTIONS:
919 1 : nValue = SQL_SNVF_CHAR_LENGTH |
920 : SQL_SNVF_CHARACTER_LENGTH |
921 : SQL_SNVF_EXTRACT |
922 : SQL_SNVF_OCTET_LENGTH |
923 : SQL_SNVF_POSITION;
924 : /* SQL_SNVF_BIT_LENGTH */
925 1 : break;
926 1 : case SQL_SQL92_PREDICATES: /* ? */
927 1 : nValue = SQL_SP_BETWEEN |
928 : SQL_SP_COMPARISON |
929 : SQL_SP_EXISTS |
930 : SQL_SP_IN |
931 : SQL_SP_ISNOTNULL |
932 : SQL_SP_ISNULL |
933 : SQL_SP_LIKE |
934 : SQL_SP_MATCH_FULL |
935 : SQL_SP_MATCH_PARTIAL|
936 : SQL_SP_MATCH_UNIQUE_FULL |
937 : SQL_SP_MATCH_UNIQUE_PARTIAL |
938 : SQL_SP_OVERLAPS |
939 : SQL_SP_QUANTIFIED_COMPARISON |
940 : SQL_SP_UNIQUE;
941 1 : break;
942 1 : case SQL_SQL92_RELATIONAL_JOIN_OPERATORS:
943 1 : nValue = SQL_SRJO_CORRESPONDING_CLAUSE |
944 : SQL_SRJO_CROSS_JOIN |
945 : SQL_SRJO_EXCEPT_JOIN |
946 : SQL_SRJO_FULL_OUTER_JOIN |
947 : SQL_SRJO_INNER_JOIN |
948 : SQL_SRJO_INTERSECT_JOIN |
949 : SQL_SRJO_LEFT_OUTER_JOIN |
950 : SQL_SRJO_NATURAL_JOIN |
951 : SQL_SRJO_RIGHT_OUTER_JOIN |
952 : SQL_SRJO_UNION_JOIN;
953 1 : break;
954 1 : case SQL_SQL92_REVOKE:
955 1 : nValue = SQL_SR_DELETE_TABLE |
956 : SQL_SR_GRANT_OPTION_FOR |
957 : SQL_SR_INSERT_COLUMN |
958 : SQL_SR_INSERT_TABLE |
959 : SQL_SR_REFERENCES_COLUMN |
960 : SQL_SR_REFERENCES_TABLE |
961 : SQL_SR_SELECT_TABLE |
962 : SQL_SR_UPDATE_COLUMN |
963 : SQL_SR_UPDATE_TABLE;
964 : /* SQL_SR_CASCADE |
965 : * SQL_SR_RESTRICT |
966 : * SQL_SR_USAGE_ON_DOMAIN |
967 : * SQL_SR_USAGE_ON_CHARACTER_SET |
968 : * SQL_SR_USAGE_ON_COLLATION |
969 : * SQL_SR_USAGE_ON_TRANSLATION */
970 1 : break;
971 : case SQL_SQL92_ROW_VALUE_CONSTRUCTOR: /* ? */
972 5 : nValue = SQL_SRVC_VALUE_EXPRESSION |
973 : SQL_SRVC_NULL |
974 : SQL_SRVC_DEFAULT |
975 : SQL_SRVC_ROW_SUBQUERY;
976 : break;
977 1 : case SQL_SQL92_STRING_FUNCTIONS:
978 1 : nValue = SQL_SSF_CONVERT |
979 : SQL_SSF_LOWER |
980 : SQL_SSF_UPPER |
981 : SQL_SSF_SUBSTRING |
982 : SQL_SSF_TRIM_BOTH |
983 : SQL_SSF_TRIM_LEADING |
984 : SQL_SSF_TRIM_TRAILING;
985 1 : break;
986 : /* SQL_SSF_TRANSLATE */
987 : case SQL_SQL92_VALUE_EXPRESSIONS:
988 5 : nValue = SQL_SVE_CASE |
989 : SQL_SVE_CAST |
990 : SQL_SVE_COALESCE |
991 : SQL_SVE_NULLIF;
992 : break;
993 1 : case SQL_STANDARD_CLI_CONFORMANCE: /* ? */
994 1 : nValue = SQL_SCC_XOPEN_CLI_VERSION1 | SQL_SCC_ISO92_CLI;
995 1 : break;
996 : case SQL_STATIC_CURSOR_ATTRIBUTES1:
997 8 : nValue = SQL_CA1_ABSOLUTE |
998 : SQL_CA1_NEXT |
999 : SQL_CA1_RELATIVE;
1000 : /* SQL_CA1_BOOKMARK |
1001 : * SQL_CA1_BULK_ADD |
1002 : * SQL_CA1_BULK_DELETE_BY_BOOKMARK |
1003 : * SQL_CA1_BULK_FETCH_BY_BOOKMARK |
1004 : * SQL_CA1_BULK_UPDATE_BY_BOOKMARK |
1005 : * SQL_CA1_LOCK_EXCLUSIVE |
1006 : * SQL_CA1_LOCK_NO_CHANGE |
1007 : * SQL_CA1_LOCK_UNLOCK |
1008 : * SQL_CA1_POS_DELETE |
1009 : * SQL_CA1_POSITIONED_DELETE |
1010 : * SQL_CA1_POSITIONED_UPDATE |
1011 : * SQL_CA1_POS_POSITION |
1012 : * SQL_CA1_POS_REFRESH |
1013 : * SQL_CA1_POS_UPDATE |
1014 : * SQL_CA1_SELECT_FOR_UPDATE */
1015 : break;
1016 : case SQL_STATIC_CURSOR_ATTRIBUTES2:
1017 : /* SQL_CA2_CRC_APPROXIMATE |
1018 : * SQL_CA2_CRC_EXACT |
1019 : * SQL_CA2_LOCK_CONCURRENCY |
1020 : * SQL_CA2_MAX_ROWS_AFFECTS_ALL |
1021 : * SQL_CA2_MAX_ROWS_CATALOG |
1022 : * SQL_CA2_MAX_ROWS_DELETE |
1023 : * SQL_CA2_MAX_ROWS_INSERT |
1024 : * SQL_CA2_MAX_ROWS_SELECT |
1025 : * SQL_CA2_MAX_ROWS_UPDATE |
1026 : * SQL_CA2_OPT_ROWVER_CONCURRENCY |
1027 : * SQL_CA2_OPT_VALUES_CONCURRENCY |
1028 : * SQL_CA2_READ_ONLY_CONCURRENCY |
1029 : * SQL_CA2_SENSITIVITY_ADDITIONS |
1030 : * SQL_CA2_SENSITIVITY_DELETIONS |
1031 : * SQL_CA2_SENSITIVITY_UPDATES |
1032 : * SQL_CA2_SIMULATE_NON_UNIQUE |
1033 : * SQL_CA2_SIMULATE_TRY_UNIQUE |
1034 : * SQL_CA2_SIMULATE_UNIQUE */
1035 : break;
1036 1 : case SQL_STRING_FUNCTIONS:
1037 1 : nValue = SQL_FN_STR_ASCII |
1038 : SQL_FN_STR_CHAR |
1039 : SQL_FN_STR_CHARACTER_LENGTH |
1040 : SQL_FN_STR_CHAR_LENGTH |
1041 : SQL_FN_STR_CONCAT |
1042 : SQL_FN_STR_DIFFERENCE |
1043 : SQL_FN_STR_INSERT |
1044 : SQL_FN_STR_LCASE |
1045 : SQL_FN_STR_LEFT |
1046 : SQL_FN_STR_LENGTH |
1047 : SQL_FN_STR_LOCATE |
1048 : SQL_FN_STR_LOCATE_2 |
1049 : SQL_FN_STR_LTRIM |
1050 : SQL_FN_STR_OCTET_LENGTH |
1051 : SQL_FN_STR_POSITION |
1052 : SQL_FN_STR_REPEAT |
1053 : SQL_FN_STR_REPLACE |
1054 : SQL_FN_STR_RIGHT |
1055 : SQL_FN_STR_RTRIM |
1056 : SQL_FN_STR_SOUNDEX |
1057 : SQL_FN_STR_SPACE |
1058 : SQL_FN_STR_SUBSTRING |
1059 : SQL_FN_STR_UCASE;
1060 : /* SQL_FN_STR_BIT_LENGTH */
1061 1 : break;
1062 : case SQL_SUBQUERIES:
1063 2 : nValue = SQL_SQ_CORRELATED_SUBQUERIES |
1064 : SQL_SQ_COMPARISON |
1065 : SQL_SQ_EXISTS |
1066 : SQL_SQ_IN |
1067 : SQL_SQ_QUANTIFIED;
1068 : break;
1069 : case SQL_SYSTEM_FUNCTIONS:
1070 8 : nValue = SQL_FN_SYS_DBNAME |
1071 : SQL_FN_SYS_IFNULL |
1072 : SQL_FN_SYS_USERNAME;
1073 : break;
1074 1 : case SQL_TABLE_TERM:
1075 1 : sValue = "table";
1076 1 : break;
1077 2 : case SQL_TIMEDATE_ADD_INTERVALS:
1078 : case SQL_TIMEDATE_DIFF_INTERVALS:
1079 : /* when server is 11.46 or higher */
1080 2 : nValue = SQL_FN_TSI_FRAC_SECOND |
1081 : SQL_FN_TSI_SECOND |
1082 : SQL_FN_TSI_MINUTE |
1083 : SQL_FN_TSI_HOUR |
1084 : SQL_FN_TSI_DAY |
1085 : SQL_FN_TSI_WEEK |
1086 : SQL_FN_TSI_MONTH |
1087 : SQL_FN_TSI_QUARTER |
1088 : SQL_FN_TSI_YEAR;
1089 2 : break;
1090 1 : case SQL_TIMEDATE_FUNCTIONS:
1091 1 : nValue = SQL_FN_TD_CURRENT_DATE |
1092 : SQL_FN_TD_CURRENT_TIME |
1093 : SQL_FN_TD_CURRENT_TIMESTAMP |
1094 : SQL_FN_TD_CURDATE |
1095 : SQL_FN_TD_CURTIME |
1096 : SQL_FN_TD_DAYNAME | /* when server is 11.46 or higher */
1097 : SQL_FN_TD_DAYOFMONTH |
1098 : SQL_FN_TD_DAYOFWEEK |
1099 : SQL_FN_TD_DAYOFYEAR |
1100 : SQL_FN_TD_EXTRACT |
1101 : SQL_FN_TD_HOUR |
1102 : SQL_FN_TD_MINUTE |
1103 : SQL_FN_TD_MONTH |
1104 : SQL_FN_TD_MONTHNAME | /* when server is 11.46 or higher */
1105 : SQL_FN_TD_NOW |
1106 : SQL_FN_TD_QUARTER |
1107 : SQL_FN_TD_SECOND |
1108 : SQL_FN_TD_TIMESTAMPADD | /* when server is 11.46 or higher */
1109 : SQL_FN_TD_TIMESTAMPDIFF | /* when server is 11.46 or higher */
1110 : SQL_FN_TD_WEEK |
1111 : SQL_FN_TD_YEAR;
1112 1 : break;
1113 : case SQL_TXN_CAPABLE:
1114 3 : nValue = SQL_TC_ALL;
1115 3 : len = sizeof(SQLUSMALLINT);
1116 : break;
1117 : case SQL_TXN_ISOLATION_OPTION:
1118 3 : nValue = SQL_TXN_SERIALIZABLE;
1119 : break;
1120 : case SQL_UNION:
1121 1 : nValue = SQL_U_UNION | SQL_U_UNION_ALL;
1122 : break;
1123 1 : case SQL_USER_NAME:
1124 1 : sValue = dbc->uid ? dbc->uid : "";
1125 : break;
1126 : case SQL_XOPEN_CLI_YEAR: /* ? */
1127 0 : sValue = "";
1128 : break;
1129 :
1130 : /* deprecated info types */
1131 0 : case SQL_FETCH_DIRECTION:
1132 0 : nValue = SQL_FD_FETCH_ABSOLUTE |
1133 : SQL_FD_FETCH_FIRST |
1134 : SQL_FD_FETCH_LAST |
1135 : SQL_FD_FETCH_NEXT |
1136 : SQL_FD_FETCH_PRIOR |
1137 : SQL_FD_FETCH_RELATIVE;
1138 : /* SQL_FD_FETCH_BOOKMARK */
1139 0 : len = sizeof(SQLUSMALLINT);
1140 0 : break;
1141 : case SQL_LOCK_TYPES:
1142 1 : nValue = SQL_LCK_NO_CHANGE;
1143 : /* SQL_LCK_EXCLUSIVE | SQL_LCK_UNLOCK */
1144 : break;
1145 : case SQL_ODBC_API_CONFORMANCE:
1146 3 : nValue = SQL_OAC_LEVEL2;
1147 : /* SQL_OAC_CORE, SQL_OAC_LEVEL1 */
1148 3 : len = sizeof(SQLUSMALLINT);
1149 : break;
1150 0 : case SQL_ODBC_SQL_CONFORMANCE:
1151 0 : nValue = SQL_OSC_CORE;
1152 : /* SQL_OSC_MINIMUM, SQL_OSC_EXTENDED */
1153 0 : len = sizeof(SQLUSMALLINT);
1154 0 : break;
1155 1 : case SQL_POS_OPERATIONS:
1156 1 : nValue = SQL_POS_POSITION;
1157 : /* SQL_POS_ADD |
1158 : * SQL_POS_DELETE |
1159 : * SQL_POS_REFRESH |
1160 : * SQL_POS_UPDATE */
1161 1 : break;
1162 0 : case SQL_POSITIONED_STATEMENTS:
1163 0 : nValue = SQL_PS_SELECT_FOR_UPDATE;
1164 : /* SQL_PS_POSITIONED_DELETE |
1165 : * SQL_PS_POSITIONED_UPDATE |
1166 : * SQL_PS_SELECT_FOR_UPDATE */
1167 0 : break;
1168 0 : case SQL_SCROLL_CONCURRENCY:
1169 0 : nValue = SQL_SCCO_READ_ONLY;
1170 : /* SQL_SCCO_LOCK |
1171 : * SQL_SCCO_OPT_ROWVER |
1172 : * SQL_SCCO_OPT_VALUES */
1173 0 : len = sizeof(SQLUSMALLINT);
1174 0 : break;
1175 : case SQL_STATIC_SENSITIVITY:
1176 : /* SQL_SS_ADDITIONS |
1177 : * SQL_SS_DELETIONS |
1178 : * SQL_SS_UPDATES */
1179 : len = sizeof(SQLINTEGER);
1180 : break;
1181 :
1182 0 : case SQL_ODBC_SAG_CLI_CONFORMANCE:
1183 0 : nValue = SQL_OSCC_COMPLIANT;
1184 0 : len = sizeof(SQLUSMALLINT);
1185 0 : break;
1186 0 : case SQL_OUTER_JOINS:
1187 0 : sValue = "Y"; /* "N" */
1188 0 : break;
1189 :
1190 0 : default:
1191 : /* Invalid information type */
1192 0 : addDbcError(dbc, "HY096", NULL, 0);
1193 0 : return SQL_ERROR;
1194 : }
1195 :
1196 : /* copy the data to the supplied output parameters */
1197 165 : if (sValue) {
1198 37 : copyString(sValue, strlen(sValue), InfoValuePtr, BufferLength, StringLengthPtr, SQLSMALLINT, addDbcError, dbc, return SQL_ERROR);
1199 128 : } else if (InfoValuePtr) {
1200 128 : if (len == sizeof(SQLUINTEGER))
1201 97 : *(SQLUINTEGER *) InfoValuePtr = (SQLUINTEGER) nValue;
1202 : #ifndef SQLULEN
1203 : /* if SQLULEN is defined, it's defined as SQLUINTEGER
1204 : * which we've handled */
1205 31 : else if (len == sizeof(SQLULEN))
1206 : *(SQLULEN *) InfoValuePtr = (SQLULEN) nValue;
1207 : #endif
1208 31 : else if (len == sizeof(SQLUSMALLINT))
1209 31 : *(SQLUSMALLINT *) InfoValuePtr = (SQLUSMALLINT) nValue;
1210 128 : if (StringLengthPtr)
1211 128 : *StringLengthPtr = len;
1212 : }
1213 :
1214 165 : if (hdl)
1215 1 : mapi_close_handle(hdl);
1216 :
1217 165 : return dbc->Error ? SQL_SUCCESS_WITH_INFO : SQL_SUCCESS;
1218 : }
1219 :
1220 : #ifdef ODBCDEBUG
1221 : static char *
1222 0 : translateInfoType(SQLUSMALLINT InfoType)
1223 : {
1224 0 : static char unknown[32];
1225 :
1226 0 : switch (InfoType) {
1227 : case SQL_ACCESSIBLE_PROCEDURES:
1228 : return "SQL_ACCESSIBLE_PROCEDURES";
1229 0 : case SQL_ACCESSIBLE_TABLES:
1230 0 : return "SQL_ACCESSIBLE_TABLES";
1231 0 : case SQL_ACTIVE_ENVIRONMENTS:
1232 0 : return "SQL_ACTIVE_ENVIRONMENTS";
1233 0 : case SQL_AGGREGATE_FUNCTIONS:
1234 0 : return "SQL_AGGREGATE_FUNCTIONS";
1235 0 : case SQL_ALTER_DOMAIN:
1236 0 : return "SQL_ALTER_DOMAIN";
1237 : #ifdef SQL_ALTER_SCHEMA
1238 : case SQL_ALTER_SCHEMA:
1239 : return "SQL_ALTER_SCHEMA";
1240 : #endif
1241 0 : case SQL_ALTER_TABLE:
1242 0 : return "SQL_ALTER_TABLE";
1243 : #ifdef SQL_ANSI_SQL_DATETIME_LITERALS
1244 : case SQL_ANSI_SQL_DATETIME_LITERALS:
1245 : return "SQL_ANSI_SQL_DATETIME_LITERALS";
1246 : #endif
1247 : #ifdef SQL_ASYNC_DBC_FUNCTIONS
1248 : case SQL_ASYNC_DBC_FUNCTIONS:
1249 : return "SQL_ASYNC_DBC_FUNCTIONS";
1250 : #endif
1251 0 : case SQL_ASYNC_MODE:
1252 0 : return "SQL_ASYNC_MODE";
1253 : #ifdef SQL_ASYNC_NOTIFICATION
1254 : case SQL_ASYNC_NOTIFICATION:
1255 : return "SQL_ASYNC_NOTIFICATION";
1256 : #endif
1257 0 : case SQL_BATCH_ROW_COUNT:
1258 0 : return "SQL_BATCH_ROW_COUNT";
1259 0 : case SQL_BATCH_SUPPORT:
1260 0 : return "SQL_BATCH_SUPPORT";
1261 0 : case SQL_BOOKMARK_PERSISTENCE:
1262 0 : return "SQL_BOOKMARK_PERSISTENCE";
1263 0 : case SQL_CATALOG_LOCATION:
1264 0 : return "SQL_CATALOG_LOCATION";
1265 0 : case SQL_CATALOG_NAME:
1266 0 : return "SQL_CATALOG_NAME";
1267 0 : case SQL_CATALOG_NAME_SEPARATOR:
1268 0 : return "SQL_CATALOG_NAME_SEPARATOR";
1269 0 : case SQL_CATALOG_TERM:
1270 0 : return "SQL_CATALOG_TERM";
1271 0 : case SQL_CATALOG_USAGE:
1272 0 : return "SQL_CATALOG_USAGE";
1273 0 : case SQL_COLLATION_SEQ:
1274 0 : return "SQL_COLLATION_SEQ";
1275 0 : case SQL_COLUMN_ALIAS:
1276 0 : return "SQL_COLUMN_ALIAS";
1277 0 : case SQL_CONCAT_NULL_BEHAVIOR:
1278 0 : return "SQL_CONCAT_NULL_BEHAVIOR";
1279 0 : case SQL_CONVERT_BIGINT:
1280 0 : return "SQL_CONVERT_BIGINT";
1281 0 : case SQL_CONVERT_BINARY:
1282 0 : return "SQL_CONVERT_BINARY";
1283 0 : case SQL_CONVERT_BIT:
1284 0 : return "SQL_CONVERT_BIT";
1285 0 : case SQL_CONVERT_CHAR:
1286 0 : return "SQL_CONVERT_CHAR";
1287 0 : case SQL_CONVERT_DATE:
1288 0 : return "SQL_CONVERT_DATE";
1289 0 : case SQL_CONVERT_DECIMAL:
1290 0 : return "SQL_CONVERT_DECIMAL";
1291 0 : case SQL_CONVERT_DOUBLE:
1292 0 : return "SQL_CONVERT_DOUBLE";
1293 0 : case SQL_CONVERT_FLOAT:
1294 0 : return "SQL_CONVERT_FLOAT";
1295 0 : case SQL_CONVERT_FUNCTIONS:
1296 0 : return "SQL_CONVERT_FUNCTIONS";
1297 0 : case SQL_CONVERT_INTEGER:
1298 0 : return "SQL_CONVERT_INTEGER";
1299 0 : case SQL_CONVERT_INTERVAL_DAY_TIME:
1300 0 : return "SQL_CONVERT_INTERVAL_DAY_TIME";
1301 0 : case SQL_CONVERT_INTERVAL_YEAR_MONTH:
1302 0 : return "SQL_CONVERT_INTERVAL_YEAR_MONTH";
1303 0 : case SQL_CONVERT_LONGVARBINARY:
1304 0 : return "SQL_CONVERT_LONGVARBINARY";
1305 0 : case SQL_CONVERT_LONGVARCHAR:
1306 0 : return "SQL_CONVERT_LONGVARCHAR";
1307 0 : case SQL_CONVERT_NUMERIC:
1308 0 : return "SQL_CONVERT_NUMERIC";
1309 0 : case SQL_CONVERT_REAL:
1310 0 : return "SQL_CONVERT_REAL";
1311 0 : case SQL_CONVERT_SMALLINT:
1312 0 : return "SQL_CONVERT_SMALLINT";
1313 0 : case SQL_CONVERT_TIME:
1314 0 : return "SQL_CONVERT_TIME";
1315 0 : case SQL_CONVERT_TIMESTAMP:
1316 0 : return "SQL_CONVERT_TIMESTAMP";
1317 0 : case SQL_CONVERT_TINYINT:
1318 0 : return "SQL_CONVERT_TINYINT";
1319 0 : case SQL_CONVERT_VARBINARY:
1320 0 : return "SQL_CONVERT_VARBINARY";
1321 0 : case SQL_CONVERT_VARCHAR:
1322 0 : return "SQL_CONVERT_VARCHAR";
1323 0 : case SQL_CORRELATION_NAME:
1324 0 : return "SQL_CORRELATION_NAME";
1325 0 : case SQL_CREATE_ASSERTION:
1326 0 : return "SQL_CREATE_ASSERTION";
1327 0 : case SQL_CREATE_CHARACTER_SET:
1328 0 : return "SQL_CREATE_CHARACTER_SET";
1329 0 : case SQL_CREATE_COLLATION:
1330 0 : return "SQL_CREATE_COLLATION";
1331 0 : case SQL_CREATE_DOMAIN:
1332 0 : return "SQL_CREATE_DOMAIN";
1333 0 : case SQL_CREATE_SCHEMA:
1334 0 : return "SQL_CREATE_SCHEMA";
1335 0 : case SQL_CREATE_TABLE:
1336 0 : return "SQL_CREATE_TABLE";
1337 0 : case SQL_CREATE_TRANSLATION:
1338 0 : return "SQL_CREATE_TRANSLATION";
1339 0 : case SQL_CREATE_VIEW:
1340 0 : return "SQL_CREATE_VIEW";
1341 0 : case SQL_CURSOR_COMMIT_BEHAVIOR:
1342 0 : return "SQL_CURSOR_COMMIT_BEHAVIOR";
1343 0 : case SQL_CURSOR_ROLLBACK_BEHAVIOR:
1344 0 : return "SQL_CURSOR_ROLLBACK_BEHAVIOR";
1345 0 : case SQL_CURSOR_SENSITIVITY:
1346 0 : return "SQL_CURSOR_SENSITIVITY";
1347 0 : case SQL_DATABASE_NAME:
1348 0 : return "SQL_DATABASE_NAME";
1349 0 : case SQL_DATA_SOURCE_NAME:
1350 0 : return "SQL_DATA_SOURCE_NAME";
1351 0 : case SQL_DATA_SOURCE_READ_ONLY:
1352 0 : return "SQL_DATA_SOURCE_READ_ONLY";
1353 0 : case SQL_DATETIME_LITERALS:
1354 0 : return "SQL_DATETIME_LITERALS";
1355 0 : case SQL_DBMS_NAME:
1356 0 : return "SQL_DBMS_NAME";
1357 0 : case SQL_DBMS_VER:
1358 0 : return "SQL_DBMS_VER";
1359 0 : case SQL_DDL_INDEX:
1360 0 : return "SQL_DDL_INDEX";
1361 0 : case SQL_DEFAULT_TXN_ISOLATION:
1362 0 : return "SQL_DEFAULT_TXN_ISOLATION";
1363 0 : case SQL_DESCRIBE_PARAMETER:
1364 0 : return "SQL_DESCRIBE_PARAMETER";
1365 0 : case SQL_DM_VER:
1366 0 : return "SQL_DM_VER";
1367 : #ifdef SQL_DRIVER_AWARE_POOLING_SUPPORTED
1368 0 : case SQL_DRIVER_AWARE_POOLING_SUPPORTED:
1369 0 : return "SQL_DRIVER_AWARE_POOLING_SUPPORTED";
1370 : #endif
1371 0 : case SQL_DRIVER_HDBC:
1372 0 : return "SQL_DRIVER_HDBC";
1373 0 : case SQL_DRIVER_HDESC:
1374 0 : return "SQL_DRIVER_HDESC";
1375 0 : case SQL_DRIVER_HENV:
1376 0 : return "SQL_DRIVER_HENV";
1377 0 : case SQL_DRIVER_HLIB:
1378 0 : return "SQL_DRIVER_HLIB";
1379 0 : case SQL_DRIVER_HSTMT:
1380 0 : return "SQL_DRIVER_HSTMT";
1381 0 : case SQL_DRIVER_NAME:
1382 0 : return "SQL_DRIVER_NAME";
1383 0 : case SQL_DRIVER_ODBC_VER:
1384 0 : return "SQL_DRIVER_ODBC_VER";
1385 0 : case SQL_DRIVER_VER:
1386 0 : return "SQL_DRIVER_VER";
1387 0 : case SQL_DROP_ASSERTION:
1388 0 : return "SQL_DROP_ASSERTION";
1389 0 : case SQL_DROP_CHARACTER_SET:
1390 0 : return "SQL_DROP_CHARACTER_SET";
1391 0 : case SQL_DROP_COLLATION:
1392 0 : return "SQL_DROP_COLLATION";
1393 0 : case SQL_DROP_DOMAIN:
1394 0 : return "SQL_DROP_DOMAIN";
1395 0 : case SQL_DROP_SCHEMA:
1396 0 : return "SQL_DROP_SCHEMA";
1397 0 : case SQL_DROP_TABLE:
1398 0 : return "SQL_DROP_TABLE";
1399 0 : case SQL_DROP_TRANSLATION:
1400 0 : return "SQL_DROP_TRANSLATION";
1401 0 : case SQL_DROP_VIEW:
1402 0 : return "SQL_DROP_VIEW";
1403 0 : case SQL_DYNAMIC_CURSOR_ATTRIBUTES1:
1404 0 : return "SQL_DYNAMIC_CURSOR_ATTRIBUTES1";
1405 0 : case SQL_DYNAMIC_CURSOR_ATTRIBUTES2:
1406 0 : return "SQL_DYNAMIC_CURSOR_ATTRIBUTES2";
1407 0 : case SQL_EXPRESSIONS_IN_ORDERBY:
1408 0 : return "SQL_EXPRESSIONS_IN_ORDERBY";
1409 0 : case SQL_FETCH_DIRECTION:
1410 0 : return "SQL_FETCH_DIRECTION";
1411 0 : case SQL_FILE_USAGE:
1412 0 : return "SQL_FILE_USAGE";
1413 0 : case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1:
1414 0 : return "SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1";
1415 0 : case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2:
1416 0 : return "SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2";
1417 0 : case SQL_GETDATA_EXTENSIONS:
1418 0 : return "SQL_GETDATA_EXTENSIONS";
1419 0 : case SQL_GROUP_BY:
1420 0 : return "SQL_GROUP_BY";
1421 0 : case SQL_IDENTIFIER_CASE:
1422 0 : return "SQL_IDENTIFIER_CASE";
1423 0 : case SQL_IDENTIFIER_QUOTE_CHAR:
1424 0 : return "SQL_IDENTIFIER_QUOTE_CHAR";
1425 0 : case SQL_INDEX_KEYWORDS:
1426 0 : return "SQL_INDEX_KEYWORDS";
1427 0 : case SQL_INFO_SCHEMA_VIEWS:
1428 0 : return "SQL_INFO_SCHEMA_VIEWS";
1429 0 : case SQL_INSERT_STATEMENT:
1430 0 : return "SQL_INSERT_STATEMENT";
1431 0 : case SQL_INTEGRITY:
1432 0 : return "SQL_INTEGRITY";
1433 0 : case SQL_KEYSET_CURSOR_ATTRIBUTES1:
1434 0 : return "SQL_KEYSET_CURSOR_ATTRIBUTES1";
1435 0 : case SQL_KEYSET_CURSOR_ATTRIBUTES2:
1436 0 : return "SQL_KEYSET_CURSOR_ATTRIBUTES2";
1437 0 : case SQL_KEYWORDS:
1438 0 : return "SQL_KEYWORDS";
1439 0 : case SQL_LIKE_ESCAPE_CLAUSE:
1440 0 : return "SQL_LIKE_ESCAPE_CLAUSE";
1441 0 : case SQL_LOCK_TYPES:
1442 0 : return "SQL_LOCK_TYPES";
1443 0 : case SQL_MAX_ASYNC_CONCURRENT_STATEMENTS:
1444 0 : return "SQL_MAX_ASYNC_CONCURRENT_STATEMENTS";
1445 0 : case SQL_MAX_BINARY_LITERAL_LEN:
1446 0 : return "SQL_MAX_BINARY_LITERAL_LEN";
1447 0 : case SQL_MAX_CATALOG_NAME_LEN:
1448 0 : return "SQL_MAX_CATALOG_NAME_LEN";
1449 0 : case SQL_MAX_CHAR_LITERAL_LEN:
1450 0 : return "SQL_MAX_CHAR_LITERAL_LEN";
1451 0 : case SQL_MAX_COLUMN_NAME_LEN:
1452 0 : return "SQL_MAX_COLUMN_NAME_LEN";
1453 0 : case SQL_MAX_COLUMNS_IN_GROUP_BY:
1454 0 : return "SQL_MAX_COLUMNS_IN_GROUP_BY";
1455 0 : case SQL_MAX_COLUMNS_IN_INDEX:
1456 0 : return "SQL_MAX_COLUMNS_IN_INDEX";
1457 0 : case SQL_MAX_COLUMNS_IN_ORDER_BY:
1458 0 : return "SQL_MAX_COLUMNS_IN_ORDER_BY";
1459 0 : case SQL_MAX_COLUMNS_IN_SELECT:
1460 0 : return "SQL_MAX_COLUMNS_IN_SELECT";
1461 0 : case SQL_MAX_COLUMNS_IN_TABLE:
1462 0 : return "SQL_MAX_COLUMNS_IN_TABLE";
1463 0 : case SQL_MAX_CONCURRENT_ACTIVITIES:
1464 0 : return "SQL_MAX_CONCURRENT_ACTIVITIES";
1465 0 : case SQL_MAX_CURSOR_NAME_LEN:
1466 0 : return "SQL_MAX_CURSOR_NAME_LEN";
1467 0 : case SQL_MAX_DRIVER_CONNECTIONS:
1468 0 : return "SQL_MAX_DRIVER_CONNECTIONS";
1469 0 : case SQL_MAX_IDENTIFIER_LEN:
1470 0 : return "SQL_MAX_IDENTIFIER_LEN";
1471 0 : case SQL_MAX_INDEX_SIZE:
1472 0 : return "SQL_MAX_INDEX_SIZE";
1473 0 : case SQL_MAX_PROCEDURE_NAME_LEN:
1474 0 : return "SQL_MAX_PROCEDURE_NAME_LEN";
1475 0 : case SQL_MAX_ROW_SIZE:
1476 0 : return "SQL_MAX_ROW_SIZE";
1477 0 : case SQL_MAX_ROW_SIZE_INCLUDES_LONG:
1478 0 : return "SQL_MAX_ROW_SIZE_INCLUDES_LONG";
1479 0 : case SQL_MAX_SCHEMA_NAME_LEN:
1480 0 : return "SQL_MAX_SCHEMA_NAME_LEN";
1481 0 : case SQL_MAX_STATEMENT_LEN:
1482 0 : return "SQL_MAX_STATEMENT_LEN";
1483 0 : case SQL_MAX_TABLE_NAME_LEN:
1484 0 : return "SQL_MAX_TABLE_NAME_LEN";
1485 0 : case SQL_MAX_TABLES_IN_SELECT:
1486 0 : return "SQL_MAX_TABLES_IN_SELECT";
1487 0 : case SQL_MAX_USER_NAME_LEN:
1488 0 : return "SQL_MAX_USER_NAME_LEN";
1489 0 : case SQL_MULTIPLE_ACTIVE_TXN:
1490 0 : return "SQL_MULTIPLE_ACTIVE_TXN";
1491 0 : case SQL_MULT_RESULT_SETS:
1492 0 : return "SQL_MULT_RESULT_SETS";
1493 0 : case SQL_NEED_LONG_DATA_LEN:
1494 0 : return "SQL_NEED_LONG_DATA_LEN";
1495 0 : case SQL_NON_NULLABLE_COLUMNS:
1496 0 : return "SQL_NON_NULLABLE_COLUMNS";
1497 0 : case SQL_NULL_COLLATION:
1498 0 : return "SQL_NULL_COLLATION";
1499 0 : case SQL_NUMERIC_FUNCTIONS:
1500 0 : return "SQL_NUMERIC_FUNCTIONS";
1501 0 : case SQL_ODBC_API_CONFORMANCE:
1502 0 : return "SQL_ODBC_API_CONFORMANCE";
1503 0 : case SQL_ODBC_INTERFACE_CONFORMANCE:
1504 0 : return "SQL_ODBC_INTERFACE_CONFORMANCE";
1505 0 : case SQL_ODBC_SAG_CLI_CONFORMANCE:
1506 0 : return "SQL_ODBC_SAG_CLI_CONFORMANCE";
1507 0 : case SQL_ODBC_SQL_CONFORMANCE:
1508 0 : return "SQL_ODBC_SQL_CONFORMANCE";
1509 : #ifdef SQL_ODBC_STANDARD_CLI_CONFORMANCE
1510 : case SQL_ODBC_STANDARD_CLI_CONFORMANCE:
1511 : return "SQL_ODBC_STANDARD_CLI_CONFORMANCE";
1512 : #endif
1513 0 : case SQL_ODBC_VER:
1514 0 : return "SQL_ODBC_VER";
1515 0 : case SQL_OJ_CAPABILITIES:
1516 0 : return "SQL_OJ_CAPABILITIES";
1517 0 : case SQL_ORDER_BY_COLUMNS_IN_SELECT:
1518 0 : return "SQL_ORDER_BY_COLUMNS_IN_SELECT";
1519 0 : case SQL_OUTER_JOINS:
1520 0 : return "SQL_OUTER_JOINS";
1521 0 : case SQL_PARAM_ARRAY_ROW_COUNTS:
1522 0 : return "SQL_PARAM_ARRAY_ROW_COUNTS";
1523 0 : case SQL_PARAM_ARRAY_SELECTS:
1524 0 : return "SQL_PARAM_ARRAY_SELECTS";
1525 0 : case SQL_POSITIONED_STATEMENTS:
1526 0 : return "SQL_POSITIONED_STATEMENTS";
1527 0 : case SQL_POS_OPERATIONS:
1528 0 : return "SQL_POS_OPERATIONS";
1529 0 : case SQL_PROCEDURES:
1530 0 : return "SQL_PROCEDURES";
1531 0 : case SQL_PROCEDURE_TERM:
1532 0 : return "SQL_PROCEDURE_TERM";
1533 0 : case SQL_QUOTED_IDENTIFIER_CASE:
1534 0 : return "SQL_QUOTED_IDENTIFIER_CASE";
1535 0 : case SQL_ROW_UPDATES:
1536 0 : return "SQL_ROW_UPDATES";
1537 0 : case SQL_SCHEMA_TERM:
1538 0 : return "SQL_SCHEMA_TERM";
1539 0 : case SQL_SCHEMA_USAGE:
1540 0 : return "SQL_SCHEMA_USAGE";
1541 0 : case SQL_SCROLL_CONCURRENCY:
1542 0 : return "SQL_SCROLL_CONCURRENCY";
1543 0 : case SQL_SCROLL_OPTIONS:
1544 0 : return "SQL_SCROLL_OPTIONS";
1545 0 : case SQL_SEARCH_PATTERN_ESCAPE:
1546 0 : return "SQL_SEARCH_PATTERN_ESCAPE";
1547 0 : case SQL_SERVER_NAME:
1548 0 : return "SQL_SERVER_NAME";
1549 0 : case SQL_SPECIAL_CHARACTERS:
1550 0 : return "SQL_SPECIAL_CHARACTERS";
1551 0 : case SQL_SQL92_DATETIME_FUNCTIONS:
1552 0 : return "SQL_SQL92_DATETIME_FUNCTIONS";
1553 0 : case SQL_SQL92_FOREIGN_KEY_DELETE_RULE:
1554 0 : return "SQL_SQL92_FOREIGN_KEY_DELETE_RULE";
1555 0 : case SQL_SQL92_FOREIGN_KEY_UPDATE_RULE:
1556 0 : return "SQL_SQL92_FOREIGN_KEY_UPDATE_RULE";
1557 0 : case SQL_SQL92_GRANT:
1558 0 : return "SQL_SQL92_GRANT";
1559 0 : case SQL_SQL92_NUMERIC_VALUE_FUNCTIONS:
1560 0 : return "SQL_SQL92_NUMERIC_VALUE_FUNCTIONS";
1561 0 : case SQL_SQL92_PREDICATES:
1562 0 : return "SQL_SQL92_PREDICATES";
1563 0 : case SQL_SQL92_RELATIONAL_JOIN_OPERATORS:
1564 0 : return "SQL_SQL92_RELATIONAL_JOIN_OPERATORS";
1565 0 : case SQL_SQL92_REVOKE:
1566 0 : return "SQL_SQL92_REVOKE";
1567 0 : case SQL_SQL92_ROW_VALUE_CONSTRUCTOR:
1568 0 : return "SQL_SQL92_ROW_VALUE_CONSTRUCTOR";
1569 0 : case SQL_SQL92_STRING_FUNCTIONS:
1570 0 : return "SQL_SQL92_STRING_FUNCTIONS";
1571 0 : case SQL_SQL92_VALUE_EXPRESSIONS:
1572 0 : return "SQL_SQL92_VALUE_EXPRESSIONS";
1573 0 : case SQL_SQL_CONFORMANCE:
1574 0 : return "SQL_SQL_CONFORMANCE";
1575 0 : case SQL_STANDARD_CLI_CONFORMANCE:
1576 0 : return "SQL_STANDARD_CLI_CONFORMANCE";
1577 0 : case SQL_STATIC_CURSOR_ATTRIBUTES1:
1578 0 : return "SQL_STATIC_CURSOR_ATTRIBUTES1";
1579 0 : case SQL_STATIC_CURSOR_ATTRIBUTES2:
1580 0 : return "SQL_STATIC_CURSOR_ATTRIBUTES2";
1581 0 : case SQL_STATIC_SENSITIVITY:
1582 0 : return "SQL_STATIC_SENSITIVITY";
1583 0 : case SQL_STRING_FUNCTIONS:
1584 0 : return "SQL_STRING_FUNCTIONS";
1585 0 : case SQL_SUBQUERIES:
1586 0 : return "SQL_SUBQUERIES";
1587 0 : case SQL_SYSTEM_FUNCTIONS:
1588 0 : return "SQL_SYSTEM_FUNCTIONS";
1589 0 : case SQL_TABLE_TERM:
1590 0 : return "SQL_TABLE_TERM";
1591 0 : case SQL_TIMEDATE_ADD_INTERVALS:
1592 0 : return "SQL_TIMEDATE_ADD_INTERVALS";
1593 0 : case SQL_TIMEDATE_DIFF_INTERVALS:
1594 0 : return "SQL_TIMEDATE_DIFF_INTERVALS";
1595 0 : case SQL_TIMEDATE_FUNCTIONS:
1596 0 : return "SQL_TIMEDATE_FUNCTIONS";
1597 0 : case SQL_TXN_CAPABLE:
1598 0 : return "SQL_TXN_CAPABLE";
1599 0 : case SQL_TXN_ISOLATION_OPTION:
1600 0 : return "SQL_TXN_ISOLATION_OPTION";
1601 0 : case SQL_UNION:
1602 0 : return "SQL_UNION";
1603 0 : case SQL_USER_NAME:
1604 0 : return "SQL_USER_NAME";
1605 0 : case SQL_XOPEN_CLI_YEAR:
1606 0 : return "SQL_XOPEN_CLI_YEAR";
1607 0 : default:
1608 0 : snprintf(unknown, sizeof(unknown), "unknown (%u)",
1609 : (unsigned int) InfoType);
1610 0 : return unknown;
1611 : }
1612 : }
1613 : #endif
1614 :
1615 : SQLRETURN SQL_API
1616 : SQLGetInfo(SQLHDBC ConnectionHandle,
1617 : SQLUSMALLINT InfoType,
1618 : SQLPOINTER InfoValuePtr,
1619 : SQLSMALLINT BufferLength,
1620 : SQLSMALLINT *StringLengthPtr)
1621 : {
1622 160 : ODBCDbc *dbc = (ODBCDbc *) ConnectionHandle;
1623 :
1624 : #ifdef ODBCDEBUG
1625 160 : ODBCLOG("SQLGetInfo %p %s %p %d %p\n",
1626 : ConnectionHandle, translateInfoType(InfoType),
1627 : InfoValuePtr, (int) BufferLength,
1628 : StringLengthPtr);
1629 : #endif
1630 :
1631 160 : if (!isValidDbc(dbc))
1632 : return SQL_INVALID_HANDLE;
1633 :
1634 160 : clearDbcErrors(dbc);
1635 :
1636 160 : return MNDBGetInfo(dbc,
1637 : InfoType,
1638 : InfoValuePtr,
1639 : BufferLength,
1640 : StringLengthPtr);
1641 : }
1642 :
1643 : SQLRETURN SQL_API
1644 : SQLGetInfoA(SQLHDBC ConnectionHandle,
1645 : SQLUSMALLINT InfoType,
1646 : SQLPOINTER InfoValuePtr,
1647 : SQLSMALLINT BufferLength,
1648 : SQLSMALLINT *StringLengthPtr)
1649 : {
1650 0 : return SQLGetInfo(ConnectionHandle,
1651 : InfoType,
1652 : InfoValuePtr,
1653 : BufferLength,
1654 : StringLengthPtr);
1655 : }
1656 :
1657 : SQLRETURN SQL_API
1658 : SQLGetInfoW(SQLHDBC ConnectionHandle,
1659 : SQLUSMALLINT InfoType,
1660 : SQLPOINTER InfoValuePtr,
1661 : SQLSMALLINT BufferLength,
1662 : SQLSMALLINT *StringLengthPtr)
1663 : {
1664 5 : ODBCDbc *dbc = (ODBCDbc *) ConnectionHandle;
1665 5 : SQLRETURN rc;
1666 5 : SQLPOINTER ptr;
1667 5 : SQLSMALLINT n;
1668 :
1669 : #ifdef ODBCDEBUG
1670 5 : ODBCLOG("SQLGetInfoW %p %s %p %d %p\n",
1671 : ConnectionHandle, translateInfoType(InfoType),
1672 : InfoValuePtr, (int) BufferLength,
1673 : StringLengthPtr);
1674 : #endif
1675 :
1676 5 : if (!isValidDbc(dbc))
1677 : return SQL_INVALID_HANDLE;
1678 :
1679 5 : clearDbcErrors(dbc);
1680 :
1681 5 : switch (InfoType) {
1682 : /* all string attributes */
1683 3 : case SQL_ACCESSIBLE_PROCEDURES:
1684 : case SQL_ACCESSIBLE_TABLES:
1685 : case SQL_CATALOG_NAME:
1686 : case SQL_CATALOG_NAME_SEPARATOR:
1687 : case SQL_CATALOG_TERM:
1688 : case SQL_COLLATION_SEQ:
1689 : case SQL_COLUMN_ALIAS:
1690 : case SQL_DATABASE_NAME:
1691 : case SQL_DATA_SOURCE_NAME:
1692 : case SQL_DATA_SOURCE_READ_ONLY:
1693 : case SQL_DBMS_NAME:
1694 : case SQL_DBMS_VER:
1695 : case SQL_DESCRIBE_PARAMETER:
1696 : case SQL_DM_VER:
1697 : case SQL_DRIVER_NAME:
1698 : case SQL_DRIVER_ODBC_VER:
1699 : case SQL_DRIVER_VER:
1700 : case SQL_EXPRESSIONS_IN_ORDERBY:
1701 : case SQL_IDENTIFIER_QUOTE_CHAR:
1702 : case SQL_INTEGRITY:
1703 : case SQL_KEYWORDS:
1704 : case SQL_LIKE_ESCAPE_CLAUSE:
1705 : case SQL_MAX_ROW_SIZE_INCLUDES_LONG:
1706 : case SQL_MULTIPLE_ACTIVE_TXN:
1707 : case SQL_MULT_RESULT_SETS:
1708 : case SQL_NEED_LONG_DATA_LEN:
1709 : case SQL_ODBC_VER:
1710 : case SQL_ORDER_BY_COLUMNS_IN_SELECT:
1711 : case SQL_OUTER_JOINS:
1712 : case SQL_PROCEDURES:
1713 : case SQL_PROCEDURE_TERM:
1714 : case SQL_ROW_UPDATES:
1715 : case SQL_SCHEMA_TERM:
1716 : case SQL_SEARCH_PATTERN_ESCAPE:
1717 : case SQL_SERVER_NAME:
1718 : case SQL_SPECIAL_CHARACTERS:
1719 : case SQL_TABLE_TERM:
1720 : case SQL_USER_NAME:
1721 : case SQL_XOPEN_CLI_YEAR:
1722 3 : ptr = malloc(BufferLength);
1723 3 : if (ptr == NULL) {
1724 : /* Memory allocation error */
1725 0 : addDbcError(dbc, "HY001", NULL, 0);
1726 0 : return SQL_ERROR;
1727 : }
1728 : break;
1729 : default:
1730 : ptr = InfoValuePtr;
1731 : break;
1732 : }
1733 :
1734 5 : rc = MNDBGetInfo(dbc, InfoType, ptr, BufferLength, &n);
1735 :
1736 5 : if (ptr != InfoValuePtr) {
1737 3 : if (rc == SQL_SUCCESS_WITH_INFO) {
1738 0 : clearDbcErrors(dbc);
1739 0 : free(ptr);
1740 0 : ptr = malloc(++n); /* add one for NULL byte */
1741 0 : if (ptr == NULL) {
1742 : /* Memory allocation error */
1743 0 : addDbcError(dbc, "HY001", NULL, 0);
1744 0 : return SQL_ERROR;
1745 : }
1746 0 : rc = MNDBGetInfo(dbc, InfoType, ptr, n, &n);
1747 : }
1748 3 : if (SQL_SUCCEEDED(rc)) {
1749 3 : fixWcharOut(rc, ptr, n, InfoValuePtr, BufferLength,
1750 : StringLengthPtr, 2, addDbcError, dbc);
1751 : }
1752 3 : free(ptr);
1753 2 : } else if (StringLengthPtr)
1754 2 : *StringLengthPtr = n;
1755 :
1756 : return rc;
1757 : }
|