// 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.
= SQL Conformance

Apache Ignite supports most of the major features of ANSI-99 out-of-the-box. The following table shows Ignite compliance to link:https://en.wikipedia.org/wiki/SQL_compliance[SQL:1999 (Core), window=_blank].



[width="100%", cols="20%,80%a"]
|=======
|Feature ID, Name
|Support

| `E011` Numeric data types
| Ignite fully supports the following sub-features:

`E011–01` INTEGER and SMALLINT data types (including all spellings)

`E011–02` REAL, DOUBLE PRECISON, and FLOAT data types

`E011–05` Numeric comparison

`E011–06` Implicit casting among the numeric data types

Ignite provides partial support for the following sub-features:

`E011–03` DECIMAL and NUMERIC data types. Fixed <scale> is not supported for DEC and NUMERIC, so there are violations for:

7) If a <scale> is omitted, then a <scale> of 0 (zero) is implicit (6.1 <data type>)

22) NUMERIC specifies the data type exact numeric, with the decimal precision and scale specified by the <precision> and <scale>.

23) DECIMAL specifies the data type exact numeric, with the decimal scale specified by the <scale> and the implementation-defined decimal precision equal to or greater than the value of the specified <precision>.

`E011–04` Arithmetic operator. See issue for feature E011–03

| `E021` Character string types
| Ignite fully supports the following sub-features:

`E021–03` Character literals

`E021–04` CHARACTER_LENGTH function

`E021–05` OCTET_LENGTH function

`E021–06` SUBSTRING function

`E021–07` Character concatenation

`E021–08` UPPER and LOWER functions

`E021–09` TRIM function

`E021–10` Implicit casting among the fixed-length and variable-length character string types

`E021–11` POSITION function

`E021–12` Character comparison

Ignite provides partial support for the following sub-features:

E021–01 CHARACTER data type (including all its spellings).

----
<character string type> ::=
CHARACTER [ <left paren> <length> <right paren> ]
\| CHAR [ <left paren> <length> <right paren> ]
\| CHARACTER VARYING <left paren> <length> <right paren>
\| CHAR VARYING <left paren> <length> <right paren>
\| VARCHAR <left paren> <length> <right paren>
----

<length> is not supported for CHARACTER and CHARACTER VARYING data type.

`E021–02` CHARACTER VARYING data type (including all its spellings). See issue for feature E021–01

| `E031` Identifiers
| Ignite fully supports the following sub-features:

`E031–01` Delimited identifiers

`E031–02` Lower case identifiers

`E031–03` Trailing underscore

| `E051` Basic query specification
| Ignite fully supports the following sub-features:

`E051–01` SELECT DISTINCT

`E051–04` GROUP BY can contain columns not in <select-list>

`E051–05` Select list items can be renamed

`E051–06` HAVING clause

`E051–07` Qualified * in select list

`E051–08` Correlation names in the FROM clause

Ignite does not support the following sub-features:

`E051–02` GROUP BY clause; No support for ROLLUP, CUBE, GROUPING SETS.

`E051–09` Rename columns in the FROM clause. Some information about support from other products is link:http://modern-sql.com/feature/table-column-aliases[here, window=_blank].

| `E061` Basic predicates and search conditions
| Ignite fully supports the following sub-features:

`E061–01` Comparison predicate

`E061–02` BETWEEN predicate

`E061–03` IN predicate with list of values

`E061–06` NULL predicate

`E061–08` EXISTS predicate

`E061–09` Subqueries in comparison predicate

`E061–11` Subqueries in IN predicate

`E061–13` Correlated subqueries

`E061–14` Search condition

Ignite provides partial support for the following sub-features:

`E061–04` LIKE predicate; There is support for <character like predicate>, but <octet like predicate> could not be checked because of link:https://issues.apache.org/jira/browse/IGNITE-7480[this issue, window=_blank].

`E061–05` LIKE predicate: ESCAPE clause; There is support for <character like predicate>, but <octet like predicate> could not be checked because of link:https://issues.apache.org/jira/browse/IGNITE-7480[this issue, window=_blank].

`E061–07` Quantified comparison predicate; Except ALL (see link:https://issues.apache.org/jira/browse/IGNITE-5749[issue, window=_blank]).

Ignite does not support the following sub-feature:

`E061–12` Subqueries in quantified comparison predicate.

| `E071` Basic query expressions
| Ignite provides partial support for the following sub-features:

`E071–01` UNION DISTINCT table operator

`E071–02` UNION ALL table operator

`E071–03` EXCEPT DISTINCT table operator

`E071–05` Columns combined via table operators need not have exactly the same data type

`E071–06` Table operators in subqueries

Note that there is no support for non-recursive WITH clause in H2 and Ignite. According to link:http://www.h2database.com/html/grammar.html#with[the H2 docs, window=_blank] there is support for recursive WITH clause, but it fails in Ignite.

| E081 Basic Privileges
| Ignite does not support the following sub-feature:

`E081–01` SELECT privilege at the table level

`E081–02` DELETE privilege

`E081–03` INSERT privilege at the table level

`E081–04` UPDATE privilege at the table level

`E081–05` UPDATE privilege at the column level

`E081–06` REFERENCES privilege at the table

`E081–07` REFERENCES privilege at the column

`E081–08` WITH GRANT OPTION

`E081–09` USAGE privilege

`E081–10` EXECUTE privilege

| `E091` Set functions
| Ignite provides partial support for the following sub-features:

`E091–01` AVG

`E091–02` COUNT

`E091–03` MAX

`E091–04` MIN

`E091–05` SUM

`E091–06` ALL quantifier

`E091–07` DISTINCT quantifier

Note that there is no support for:

- GROUPING and ANY (both in H2 and Ignite).

- EVERY and SOME functions. There is support in H2, but fails in Ignite.

| `E101` Basic data manipulation
| Ignite fully supports the following sub-features:

`E101–03` Searched UPDATE statement

`E101–04` Searched DELETE statement

Ignite provides partial support for the following sub-features:

`E101–01` INSERT statement. No support for DEFAULT values in Ignite. Works in H2.

| `E111` Single row SELECT statement
| Ignite does not support this feature.

| `E121` Basic cursor support
| Ignite does not support the following sub-features

`E121–01` DECLARE CURSOR

`E121–02` ORDER BY columns need not be in select list

`E121–03` Value expressions in ORDER BY clause

`E121–04` OPEN statement

`E121–06` Positioned UPDATE statement

`E121–07` Positioned DELETE statement

`E121–08` CLOSE statement

`E121–10` FETCH statement: implicit NEXT

`E121–17` WITH HOLD cursors

| `E131` Null value support (nulls in lieu of values)
| Ignite fully supports this feature.

| `E141` Basic integrity constraints
| Ignite fully supports the following sub-feature:

`E141–01` NOT NULL constraints YES

Ignite provides partial support for the following sub-features:

`E141–03` PRIMARY KEY constraints. See link:https://issues.apache.org/jira/browse/IGNITE-7479[IGNITE-7479, window=_blank]

`E141–08` NOT NULL inferred on PRIMARY KEY. See link:https://issues.apache.org/jira/browse/IGNITE-7479[IGNITE-7479, window=_blank]

Ignite does not support the following sub-features:

`E141–02` UNIQUE constraints of NOT NULL columns

`E141–04` Basic FOREIGN KEY constraint with the NO ACTION default for both referential delete action and referential update action

`E141–06` CHECK constraints

`E141–07` Column defaults

`E141–10` Names in a foreign key can be specified in any order

| `E151` Transaction support
| Ignite does not support the following sub-features:

`E151–01` COMMIT statement

`E151–02` ROLLBACK statement

| `E152` Basic SET TRANSACTION statement
| Ignite does not support the following sub-features:

`E152–01` SET TRANSACTION statement: ISOLATION LEVEL SERIALIZABLE clause

`E152–02` SET TRANSACTION statement: READ ONLY and READ WRITE clauses

| `E153` Updatable queries with subqueries
| Ignite fully supports this feature.

| `E161` SQL comments using leading double minus
| Ignite fully supports this feature.

| `E171` SQLSTATE support
| Ignite provides partial support for this feature implementing a subset of standard error codes and introducing custom ones. A full list of errors​ supported by Ignite can be found here:

link:SQL/JDBC/jdbc-driver#error-codes[JDBC Error Codes]

link:SQL/ODBC/error-codes[ODBC Error Codes]

| `E182` Host language Binding (previously "Module Language")
| Ignite does not support this feature.

| `F021` Basic information schema
| Ignite does not support the following sub-features:

`F021–01` COLUMNS view

`F021–02` TABLES view

`F021–03` VIEWS view

`F021–04` TABLE_CONSTRAINTS

`F021–05` REFERENTIAL_CONSTRAINTS view

`F021–06` CHECK_CONSTRAINTS view

| `F031` Basic schema manipulation
| Ignite fully supports the following feature:

`F031–04` ALTER TABLE statement: ADD COLUMN clause

Ignite provides partial support for the following sub-feature:

`F031–01` CREATE TABLE statement to create persistent base tables.

Basic syntax is supported. 'AS' is supported in H2 but not in Ignite. No support for privileges (INSERT, SELECT, UPDATE, DELETE).

Ignite does not support the following sub-features:

`F031–02` CREATE VIEW statement

`F031–03` GRANT statement

`F031–13` DROP TABLE statement: RESTRICT clause

`F031–16` DROP VIEW statement: RESTRICT clause

`F031–19REVOKE` statement: RESTRICT clause

A link:sql-reference/ddl[DDL, window=_blank] is being actively developed; more features will be supported in upcoming releases.

| `F041` Basic joined table
| Ignite fully supports the following sub-features:

`F041–01` Inner join (but not necessarily the INNER keyword)
`F041–02` INNER keyword

`F041–03` LEFT OUTER JOIN

`F041–04` RIGHT OUTER JOIN

`F041–05` Outer joins can be nested

`F041–07` The inner table in a left or right outer join can also be used in an inner join

`F041–08` All comparison operators are supported (rather than just =)

| `F051` Basic date and time
| Ignite fully supports the following sub-features:

`F051–04` Comparison predicate on DATE, TIME, and TIMESTAMP data types

`F051–05` Explicit CAST between datetime types and character string types

`F051–06` CURRENT_DATE

`F051–07` LOCALTIME

`F051–08` LOCALTIMESTAMP

Ignite provides partial support for the following sub-features:

`F051–01` DATE data type (including support of DATE literal). See link:https://issues.apache.org/jira/browse/IGNITE-7360[IGNITE-7360, window=_blank].

`F051–02` TIME data type (including support of TIME literal) with fractional seconds precision of at least 0. <precision> is not supported correctly for TIME data type. Also see link:https://issues.apache.org/jira/browse/IGNITE-7360[IGNITE-7360, window=_blank].

`F051–03` TIMESTAMP data type (including support of TIMESTAMP literal) with fractional seconds precision of at least 0 and 6. <precision> is not supported correctly for TIME data type. Also see link:https://issues.apache.org/jira/browse/IGNITE-7360[IGNITE-7360, window=_blank].

| `F081` UNION and EXCEPT in views
| Ignite does not support this feature.

| `F131` Grouped operations
| Ignite does not support the following sub-features:

`F131–01` WHERE, GROUP BY, and HAVING clauses supported in queries with grouped views

`F131–02` Multiple tables supported in queries with grouped views

`F131–03` Set functions supported in queries with grouped views

`F131–04` Subqueries with GROUP BY and HAVING clauses and grouped views

`F131–05` Single row SELECT with GROUP BY and HAVING clauses and grouped views

| `F181` Multiple module support
| Ignite does not support this feature.

| `F201` CAST function
| Ignite fully supports this feature.

| `F221` Explicit defaults
| Ignite fully supports this feature.

| `F261` CASE expression
| Ignite fully supports the following sub-features:

`F261–01` Simple CASE

`F261–02` Searched CASE

`F261–03` NULLIF

`F261–04` COALESCE

| `F311` Schema definition statement
| Ignite does not support the following sub-features:

`F311–01` CREATE SCHEMA

`F311–02` CREATE TABLE for persistent base tables

`F311–03` CREATE VIEW

`F311–04` CREATE VIEW: WITH CHECK OPTION

`F311–05` GRANT statement

| `F471` Scalar subquery values
| Ignite fully supports this feature.

| `F481` Expanded NULL predicate
| Ignite fully supports this feature.

| `F501` Features and conformance views
| Ignite does not support the following sub-features:

`F501–01` SQL_FEATURES view

`F501–02` SQL_SIZING view

`F501–03` SQL_LANGUAGES view

| `F812` Basic flagging
| Ignite does not support this feature.

`S011` Distinct data types

Ignite does not support the following sub-feature:

`S011–01` USER_DEFINED_TYPES view

| `T321` Basic SQL-invoked routines
| Ignite does not support the following sub-features:

`T321–01` User-defined functions with no overloading

`T321–02` User-defined stored procedures with no overloading

`T321–03` Function invocation

`T321–04` CALL statement

`T321–05` RETURN statement

`T321–06` ROUTINES view

`T321–07` PARAMETERS view

|=======
