// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements.  See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License.  You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
= ODBC Standard Conformance

== Overview

ODBC defines several Interface conformance levels. In this section you can find which features are supported by the Apache Ignite ODBC driver.

== Core Interface Conformance

[width="100%",cols="60%,10%,30%"]
|=======================================================================
|Feature |Supported|Comments

|Allocate and free all types of handles, by calling `SQLAllocHandle` and `SQLFreeHandle`.
|YES
|

|Use all forms of the `SQLFreeStmt` function.
|YES
|

|Bind result set columns, by calling `SQLBindCol`.
|YES
|

|Handle dynamic parameters, including arrays of parameters, in the input direction only, by calling `SQLBindParameter` and `SQLNumParams`.
|YES
|

|Specify a bind offset.
|YES
|

|Use the data-at-execution dialog, involving calls to `SQLParamData` and `SQLPutData`
|YES
|

|Manage cursors and cursor names, by calling `SQLCloseCursor`, `SQLGetCursorName`, and `SQLSetCursorName`.
|PARTIALLY
|`SQLCloseCursor` is implemented. Named cursors are not supported by Ignite SQL.

|Gain access to the description (metadata) of result sets, by calling `SQLColAttribute`, `SQLDescribeCol`, `SQLNumResultCols`, and `SQLRowCount`.
|YES
|

|Query the data dictionary, by calling the catalog functions `SQLColumns`, `SQLGetTypeInfo`, `SQLStatistics`, and `SQLTables`.
|PARTIALLY
|`SQLStatistics` is not supported.

|Manage data sources and connections, by calling `SQLConnect`, `SQLDataSources`, `SQLDisconnect`, and `SQLDriverConnect`. Obtain information on drivers, no matter which ODBC level they support, by calling `SQLDrivers`.
|PARTIALLY
|DSN support is not implemented.

|Prepare and execute SQL statements, by calling `SQLExecDirect`, `SQLExecute`, and `SQLPrepare`.
|YES
|`SQLPrepare` is not supported on SQL side.

|Fetch one row of a result set or multiple rows, in the forward direction only, by calling `SQLFetch` or by calling `SQLFetchScroll` with the `FetchOrientation` argument set to `SQL_FETCH_NEXT`
|YES
|

|Obtain an unbound column in parts, by calling `SQLGetData`.
|YES
|

|Obtain current values of all attributes, by calling `SQLGetConnectAttr`, `SQLGetEnvAttr`, and `SQLGetStmtAttr`, and set all attributes to their default values and set certain attributes to non-default values by calling `SQLSetConnectAttr`, `SQLSetEnvAttr`, and `SQLSetStmtAttr`.
|PARTIALLY
|Not all attributes are currently supported. See table below for details.

|Manipulate certain fields of descriptors, by calling `SQLCopyDesc`, `SQLGetDescField`, `SQLGetDescRec`, `SQLSetDescField`, and `SQLSetDescRec`.
|NO
|

|Obtain diagnostic information, by calling `SQLGetDiagField` and `SQLGetDiagRec`.
|YES
|

|Detect driver capabilities, by calling `SQLGetFunctions` and `SQLGetInfo`. Also, detect the result of any text substitutions made to an SQL statement before it is sent to the data source, by calling `SQLNativeSql`.
|YES
|

|Use the syntax of `SQLEndTran` to commit a transaction. A Core-level driver need not support true transactions; therefore, the application cannot specify `SQL_ROLLBACK` nor `SQL_AUTOCOMMIT_OFF` for the `SQL_ATTR_AUTOCOMMIT` connection attribute.
|YES
|

|Call `SQLCancel` to cancel the data-at-execution dialog and, in multi-thread environments, to cancel an ODBC function executing in another thread. Core-level interface conformance does not mandate support for asynchronous execution of functions, nor the use of `SQLCancel` to cancel an ODBC function executing asynchronously. Neither the platform nor the ODBC driver need be multi-thread for the driver to conduct independent activities at the same time. However, in multi-thread environments, the ODBC driver must be thread-safe. Serialization of requests from the application is a conformant way to implement this specification, even though it might create serious performance problems.
|NO
|

|Obtain the `SQL_BEST_ROWID` row-identifying column of tables, by calling `SQLSpecialColumns`.
|PARTIALLY
|Current implementation always returns an empty row set.

|=======================================================================


== Level 1 Interface Conformance
[width="100%",cols="60%,10%,30%"]
|=======================================================================
|Feature|Supported|Comments

|Specify the schema of database tables and views (using two-part naming).
|YES
|

|Invoke true asynchronous execution of ODBC functions, where applicable ODBC functions are all synchronous or all asynchronous on a given connection.
|NO
|

|Use scrollable cursors, and thereby achieve access to a result set in methods other than forward-only, by calling `SQLFetchScroll` with the `FetchOrientation` argument other than `SQL_FETCH_NEXT`.
|NO
|

|Obtain primary keys of tables, by calling `SQLPrimaryKeys`.
|YES
|

|Use stored procedures, through the ODBC escape sequence for procedure calls, and query the data dictionary regarding stored procedures, by calling `SQLProcedureColumns` and `SQLProcedures`.
|NO
|

|Connect to a data source by interactively browsing the available servers, by calling `SQLBrowseConnect`.
|NO
|

|Use ODBC functions instead of SQL statements to perform certain database operations: `SQLSetPos` with `SQL_POSITION` and `SQL_REFRESH`.
|NO
|

|Gain access to the contents of multiple result sets generated by batches and stored procedures, by calling `SQLMoreResults`.
|YES
|

|Delimit transactions spanning several ODBC functions, with true atomicity and the ability to specify `SQL_ROLLBACK` in `SQLEndTran`.
|YES
|
|=======================================================================

== Level 2 Interface Conformance
[width="100%",cols="60%,10%,30%"]
|=======================================================================
|Feature|Supported|Comments

|Use three-part names of database tables and views.
|NO
|Ignite SQL does not support catalogs.

|Describe dynamic parameters, by calling `SQLDescribeParam`.
|NO
|

|Use not only input parameters but also output and input/output parameters, and result values of stored procedures.
|NO
|Ignite SQL does not support output parameters

|Use bookmarks, including retrieving bookmarks, by calling `SQLDescribeCol` and `SQLColAttribute` on column number 0; fetching based on a bookmark, by calling `SQLFetchScroll` with the `FetchOrientation` argument set to `SQL_FETCH_BOOKMARK`; and update, delete, and fetch by bookmark operations, by calling `SQLBulkOperations` with the Operation argument set to `SQL_UPDATE_BY_BOOKMARK`, `SQL_DELETE_BY_BOOKMARK`, or `SQL_FETCH_BY_BOOKMARK`.
|NO
|Ignite SQL does not support bookmarks.

|Retrieve advanced information about the data dictionary, by calling `SQLColumnPrivileges`, `SQLForeignKeys`, and `SQLTablePrivileges`.
|PARTIALLY
|`SQLForeignKeys` implemented, but returns empty result set.

|Use ODBC functions instead of SQL statements to perform additional database operations, by calling `SQLBulkOperations` with `SQL_ADD`, or `SQLSetPos` with `SQL_DELETE` or `SQL_UPDATE`.
|NO
|

|Enable asynchronous execution of ODBC functions for specified individual statements.
|NO
|

|Obtain the `SQL_ROWVER` row-identifying column of tables, by calling `SQLSpecialColumns`.
|NO
|

|Set the `SQL_ATTR_CONCURRENCY` statement attribute to at least one value other than `SQL_CONCUR_READ_ONLY`.
|NO
|

|The ability to time out login request and SQL queries (`SQL_ATTR_LOGIN_TIMEOUT` and `SQL_ATTR_QUERY_TIMEOUT`).
|YES
|

|The ability to change the default isolation level; the ability to execute transactions with the "serializable" level of isolation.
|NO
|
|=======================================================================

== Function Conformance
[width="100%",cols="70%,15%,15%"]
|=======================================================================
|Function|Supported|Conformance level

|`SQLAllocHandle`
|YES
|Core

|`SQLBindCol`
|YES
|Core

|`SQLBindParameter`
|YES
|Core

|`SQLBrowseConnect`
|NO
|Level 1

|`SQLBulkOperations`
|NO
|Level 1

|`SQLCancel`
|NO
|Core

|`SQLCloseCursor`
|YES
|Core

|`SQLColAttribute`
|YES
|Core

|`SQLColumnPrivileges`
|NO
|Level 2

|`SQLColumns`
|YES
|Core

|`SQLConnect`
|YES
|Core

|`SQLCopyDesc`
|NO
|Core

|`SQLDataSources`
|N/A
|Core

|`SQLDescribeCol`
|YES
|Core

|`SQLDescribeParam`
|NO
|Level 2

|`SQLDisconnect`
|YES
|Core

|`SQLDriverConnect`
|YES
|Core

|`SQLDrivers`
|N/A
|Core

|`SQLEndTran`
|PARTIALLY
|Core

|`SQLExecDirect`
|YES
|Core

|`SQLExecute`
|YES
|Core

|`SQLFetch`
|YES
|Core

|`SQLFetchScroll`
|YES
|Core

|`SQLForeignKeys`
|PARTIALLY
|Level 2

|`SQLFreeHandle`
|YES
|Core

|`SQLFreeStmt`
|YES
|Core

|`SQLGetConnectAttr`
|PARTIALLY
|Core

|`SQLGetCursorName`
|NO
|Core

|`SQLGetData`
|YES
|Core

|`SQLGetDescField`
|NO
|Core

|`SQLGetDescRec`
|NO
|Core

|`SQLGetDiagField`
|YES
|Core

|`SQLGetDiagRec`
|YES
|Core

|`SQLGetEnvAttr`
|PARTIALLY
|Core

|`SQLGetFunctions`
|NO
|Core

|`SQLGetInfo`
|YES
|Core

|`SQLGetStmtAttr`
|PARTIALLY
|Core

|`SQLGetTypeInfo`
|YES
|Core

|`SQLMoreResults`
|YES
|Level 1

|`SQLNativeSql`
|YES
|Core

|`SQLNumParams`
|YES
|Core

|`SQLNumResultCols`
|YES
|Core

|`SQLParamData`
|YES
|Core

|`SQLPrepare`
|YES
|Core

|`SQLPrimaryKeys`
|YES
|Level 1

|`SQLProcedureColumns`
|NO
|Level 1

|`SQLProcedures`
|NO
|Level 1

|`SQLPutData`
|YES
|Core

|`SQLRowCount`
|YES
|Core

|`SQLSetConnectAttr`
|PARTIALLY
|Core

|`SQLSetCursorName`
|NO
|Core

|`SQLSetDescField`
|NO
|Core

|`SQLSetDescRec`
|NO
|Core

|`SQLSetEnvAttr`
|PARTIALLY
|Core

|`SQLSetPos`
|NO
|Level 1

|`SQLSetStmtAttr`
|PARTIALLY
|Core

|`SQLSpecialColumns`
|PARTIALLY
|Core

|`SQLStatistics`
|NO
|Core

|`SQLTablePrivileges`
|NO
|Level 2

|`SQLTables`
|YES
|Core
|=======================================================================

== Environment Attribute Conformance
[width="100%",cols="70%,15%,15%"]
|=======================================================================
|Feature|Supported|Conformance Level

|`SQL_ATTR_CONNECTION_POOLING`
|NO
|Optional

|`SQL_ATTR_CP_MATCH`
|NO
|Optional

|`SQL_ATTR_ODBC_VER`
|YES
|Core

|`SQL_ATTR_OUTPUT_NTS`
|YES
|Optional
|=======================================================================

== Connection Attribute Conformance
[width="100%",cols="70%,15%,15%"]
|=======================================================================
|Feature|Supported|Conformance Level

|`SQL_ATTR_ACCESS_MODE`
|NO
|Core

|`SQL_ATTR_ASYNC_ENABLE`
|NO
|Level 1 / Level 2

|`SQL_ATTR_AUTO_IPD`
|NO
|Level 2

|`SQL_ATTR_AUTOCOMMIT`
|YES
|Level 1

|`SQL_ATTR_CONNECTION_DEAD`
|YES
|Level 1

|`SQL_ATTR_CONNECTION_TIMEOUT`
|YES
|Level 2

|`SQL_ATTR_CURRENT_CATALOG`
|NO
|Level 2

|`SQL_ATTR_LOGIN_TIMEOUT`
|YES
|Level 2

|`SQL_ATTR_ODBC_CURSORS`
|NO
|Core

|`SQL_ATTR_PACKET_SIZE`
|NO
|Level 2

|`SQL_ATTR_QUIET_MODE`
|NO
|Core

|`SQL_ATTR_TRACE`
|NO
|Core

|`SQL_ATTR_TRACEFILE`
|NO
|Core

|`SQL_ATTR_TRANSLATE_LIB`
|NO
|Core

|`SQL_ATTR_TRANSLATE_OPTION`
|NO
|Core

|`SQL_ATTR_TXN_ISOLATION`
|NO
|Level 1 / Level 2
|=======================================================================

== Statement Attribute Conformance
[width="100%",cols="70%,15%,15%"]
|=======================================================================
|Feature|Supported|Conformance Level

|`SQL_ATTR_APP_PARAM_DESC`
|PARTIALLY
|Core

|`SQL_ATTR_APP_ROW_DESC`
|PARTIALLY
|Core

|`SQL_ATTR_ASYNC_ENABLE`
|NO
|Level 1/ Level 2

|`SQL_ATTR_CONCURRENCY`
|NO
|Level 1 / Level 2

|`SQL_ATTR_CURSOR_SCROLLABLE`
|NO
|Level 1

|`SQL_ATTR_CURSOR_SENSITIVITY`
|NO
|Level 2

|`SQL_ATTR_CURSOR_TYPE`
|NO
|Level 1 / Level 2

|`SQL_ATTR_ENABLE_AUTO_IPD`
|NO
|Level 2

|`SQL_ATTR_FETCH_BOOKMARK_PTR`
|NO
|Level 2

|`SQL_ATTR_IMP_PARAM_DESC`
|PARTIALLY
|Core

|`SQL_ATTR_IMP_ROW_DESC`
|PARTIALLY
|Core

|`SQL_ATTR_KEYSET_SIZE`
|NO
|Level 2

|`SQL_ATTR_MAX_LENGTH`
|NO
|Level 1

|`SQL_ATTR_MAX_ROWS`
|NO
|Level 1

|`SQL_ATTR_METADATA_ID`
|NO
|Core

|`SQL_ATTR_NOSCAN`
|NO
|Core

|`SQL_ATTR_PARAM_BIND_OFFSET_PTR`
|YES
|Core

|`SQL_ATTR_PARAM_BIND_TYPE`
|NO
|Core

|`SQL_ATTR_PARAM_OPERATION_PTR`
|NO
|Core

|`SQL_ATTR_PARAM_STATUS_PTR`
|YES
|Core

|`SQL_ATTR_PARAMS_PROCESSED_PTR`
|YES
|Core

|`SQL_ATTR_PARAMSET_SIZE`
|YES
|Core

|`SQL_ATTR_QUERY_TIMEOUT`
|YES
|Level 2

|`SQL_ATTR_RETRIEVE_DATA`
|NO
|Level 1

|`SQL_ATTR_ROW_ARRAY_SIZE`
|YES
|Core

|`SQL_ATTR_ROW_BIND_OFFSET_PTR`
|YES
|Core

|`SQL_ATTR_ROW_BIND_TYPE`
|YES
|Core

|`SQL_ATTR_ROW_NUMBER`
|NO
|Level 1

|`SQL_ATTR_ROW_OPERATION_PTR`
|NO
|Level 1

|`SQL_ATTR_ROW_STATUS_PTR`
|YES
|Core

|`SQL_ATTR_ROWS_FETCHED_PTR`
|YES
|Core

|`SQL_ATTR_SIMULATE_CURSOR`
|NO
|Level 2

|`SQL_ATTR_USE_BOOKMARKS`
|NO
|Level 2
|=======================================================================

== Descriptor Header Fields Conformance
[width="100%",cols="70%,15%,15%"]
|=======================================================================
|Feature|Supported|Conformance Level

|`SQL_DESC_ALLOC_TYPE`
|NO
|Core

|`SQL_DESC_ARRAY_SIZE`
|NO
|Core

|`SQL_DESC_ARRAY_STATUS_PTR`
|NO
|Core / Level 1

|`SQL_DESC_BIND_OFFSET_PTR`
|NO
|Core

|`SQL_DESC_BIND_TYPE`
|NO
|Core

|`SQL_DESC_COUNT`
|NO
|Core

|`SQL_DESC_ROWS_PROCESSED_PTR`
|NO
|Core
|=======================================================================

== Descriptor Record Fields Conformance
[width="100%",cols="70%,15%,15%"]
|=======================================================================
|Feature|Supported|Conformance Level

|`SQL_DESC_AUTO_UNIQUE_VALUE`
|NO
|Level 2

|`SQL_DESC_BASE_COLUMN_NAME`
|NO
|Core

|`SQL_DESC_BASE_TABLE_NAME`
|NO
|Level 1

|`SQL_DESC_CASE_SENSITIVE`
|NO
|Core

|`SQL_DESC_CATALOG_NAME`
|NO
|Level 2

|`SQL_DESC_CONCISE_TYPE`
|NO
|Core

|`SQL_DESC_DATA_PTR`
|NO
|Core

|`SQL_DESC_DATETIME_INTERVAL_CODE`
|NO
|Core

|`SQL_DESC_DATETIME_INTERVAL_PRECISION`
|NO
|Core

|`SQL_DESC_DISPLAY_SIZE`
|NO
|Core

|`SQL_DESC_FIXED_PREC_SCALE`
|NO
|Core

|`SQL_DESC_INDICATOR_PTR`
|NO
|Core

|`SQL_DESC_LABEL`
|NO
|Level 2

|`SQL_DESC_LENGTH`
|NO
|Core

|`SQL_DESC_LITERAL_PREFIX`
|NO
|Core

|`SQL_DESC_LITERAL_SUFFIX`
|NO
|Core

|`SQL_DESC_LOCAL_TYPE_NAME`
|NO
|Core

|`SQL_DESC_NAME`
|NO
|Core

|`SQL_DESC_NULLABLE`
|NO
|Core

|`SQL_DESC_OCTET_LENGTH`
|NO
|Core

|`SQL_DESC_OCTET_LENGTH_PTR`
|NO
|Core

|`SQL_DESC_PARAMETER_TYPE`
|NO
|Core / Level 2

|`SQL_DESC_PRECISION`
|NO
|Core

|`SQL_DESC_ROWVER`
|NO
|Level 1

|`SQL_DESC_SCALE`
|NO
|Core

|`SQL_DESC_SCHEMA_NAME`
|NO
|Level 1

|`SQL_DESC_SEARCHABLE`
|NO
|Core

|`SQL_DESC_TABLE_NAME`
|NO
|Level 1

|`SQL_DESC_TYPE`
|NO
|Core

|`SQL_DESC_TYPE_NAME`
|NO
|Core

|`SQL_DESC_UNNAMED`
|NO
|Core

|`SQL_DESC_UNSIGNED`
|NO
|Core

|`SQL_DESC_UPDATABLE`
|NO
|Core

|=======================================================================

== SQL Data Types

The following SQL data types listed in the link:https://docs.microsoft.com/en-us/sql/odbc/reference/appendixes/sql-data-types[specification] are supported:

[width="100%",cols="80%,20%"]
|=======================================================================
|Data Type |Supported

|`SQL_CHAR`
|YES

|`SQL_VARCHAR`
|YES

|`SQL_LONGVARCHAR`
|YES

|`SQL_WCHAR`
|NO

|`SQL_WVARCHAR`
|NO

|`SQL_WLONGVARCHAR`
|NO

|`SQL_DECIMAL`
|YES

|`SQL_NUMERIC`
|NO

|`SQL_SMALLINT`
|YES

|`SQL_INTEGER`
|YES

|`SQL_REAL`
|NO

|`SQL_FLOAT`
|YES

|`SQL_DOUBLE`
|YES

|`SQL_BIT`
|YES

|`SQL_TINYINT`
|YES

|`SQL_BIGINT`
|YES

|`SQL_BINARY`
|YES

|`SQL_VARBINARY`
|YES

|`SQL_LONGVARBINARY`
|YES

|`SQL_TYPE_DATE`
|YES

|`SQL_TYPE_TIME`
|YES

|`SQL_TYPE_TIMESTAMP`
|YES

|`SQL_TYPE_UTCDATETIME`
|NO

|`SQL_TYPE_UTCTIME`
|NO

|`SQL_INTERVAL_MONTH`
|NO

|`SQL_INTERVAL_YEAR`
|NO

|`SQL_INTERVAL_YEAR_TO_MONTH`
|NO

|`SQL_INTERVAL_DAY`
|NO

|`SQL_INTERVAL_HOUR`
|NO

|`SQL_INTERVAL_MINUTE`
|NO

|`SQL_INTERVAL_SECOND`
|NO

|`SQL_INTERVAL_DAY_TO_HOUR`
|NO

|`SQL_INTERVAL_DAY_TO_MINUTE`
|NO

|`SQL_INTERVAL_DAY_TO_SECOND`
|NO

|`SQL_INTERVAL_HOUR_TO_MINUTE`
|NO

|`SQL_INTERVAL_HOUR_TO_SECOND`
|NO

|`SQL_INTERVAL_MINUTE_TO_SECOND`
|NO

|`SQL_GUID`
|YES
|=======================================================================