All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hazelcast.org.apache.calcite.sql.SqlKind Maven / Gradle / Ivy

/*
 * 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.
 */
package com.hazelcast.org.apache.calcite.sql;

import org.apiguardian.api.API;

import java.util.Collection;
import java.util.EnumSet;
import java.util.Locale;
import java.util.Set;

/**
 * Enumerates the possible types of {@link SqlNode}.
 *
 * 

The values are immutable, canonical constants, so you can use Kinds to * find particular types of expressions quickly. To identity a call to a common * operator such as '=', use {@link com.hazelcast.org.apache.calcite.sql.SqlNode#isA}:

* *
* exp.{@link com.hazelcast.org.apache.calcite.sql.SqlNode#isA isA}({@link #EQUALS}) *
* *

Only commonly-used nodes have their own type; other nodes are of type * {@link #OTHER}. Some of the values, such as {@link #SET_QUERY}, represent * aggregates.

* *

To quickly choose between a number of options, use a switch statement:

* *
*
switch (exp.getKind()) {
 * case {@link #EQUALS}:
 *     ...;
 * case {@link #NOT_EQUALS}:
 *     ...;
 * default:
 *     throw new AssertionError("unexpected");
 * }
*
* *

Note that we do not even have to check that a {@code SqlNode} is a * {@link SqlCall}.

* *

To identify a category of expressions, use {@code SqlNode.isA} with * an aggregate SqlKind. The following expression will return true * for calls to '=' and '>=', but false for the constant '5', or * a call to '+':

* *
*
exp.isA({@link #COMPARISON SqlKind.COMPARISON})
*
* *

RexNode also has a {@code getKind} method; {@code SqlKind} values are * preserved during translation from {@code SqlNode} to {@code RexNode}, where * applicable.

* *

There is no water-tight definition of "common", but that's OK. There will * always be operators that don't have their own kind, and for these we use the * {@code SqlOperator}. But for really the common ones, e.g. the many places * where we are looking for {@code AND}, {@code OR} and {@code EQUALS}, the enum * helps.

* *

(If we were using Scala, {@link SqlOperator} would be a case * class, and we wouldn't need {@code SqlKind}. But we're not.)

*/ public enum SqlKind { //~ Static fields/initializers --------------------------------------------- // the basics /** * Expression not covered by any other {@link SqlKind} value. * * @see #OTHER_FUNCTION */ OTHER, /** * SELECT statement or sub-query. */ SELECT, /** * Sql Hint statement. */ HINT, /** * Table reference. */ TABLE_REF, /** * JOIN operator or compound FROM clause. * *

A FROM clause with more than one table is represented as if it were a * join. For example, "FROM x, y, z" is represented as * "JOIN(x, JOIN(x, y))".

*/ JOIN, /** * Identifier */ IDENTIFIER, /** * A literal. */ LITERAL, /** * Function that is not a special function. * * @see #FUNCTION */ OTHER_FUNCTION, /** * POSITION Function */ POSITION, /** * EXPLAIN statement */ EXPLAIN, /** * DESCRIBE SCHEMA statement */ DESCRIBE_SCHEMA, /** * DESCRIBE TABLE statement */ DESCRIBE_TABLE, /** * INSERT statement */ INSERT, /** * DELETE statement */ DELETE, /** * UPDATE statement */ UPDATE, /** * "ALTER scope SET option = value" statement. */ SET_OPTION, /** * A dynamic parameter. */ DYNAMIC_PARAM, /** * ORDER BY clause. * * @see #DESCENDING * @see #NULLS_FIRST * @see #NULLS_LAST */ ORDER_BY, /** WITH clause. */ WITH, /** Item in WITH clause. */ WITH_ITEM, /** Item expression */ ITEM, /** * Union */ UNION, /** * Except */ EXCEPT, /** * Intersect */ INTERSECT, /** * AS operator */ AS, /** * ARGUMENT_ASSIGNMENT operator, {@code =>} */ ARGUMENT_ASSIGNMENT, /** * DEFAULT operator */ DEFAULT, /** * OVER operator */ OVER, /** * RESPECT NULLS operator */ RESPECT_NULLS("RESPECT NULLS"), /** * IGNORE NULLS operator */ IGNORE_NULLS("IGNORE NULLS"), /** * FILTER operator */ FILTER, /** * WITHIN_GROUP operator */ WITHIN_GROUP, /** * Window specification */ WINDOW, /** * MERGE statement */ MERGE, /** * TABLESAMPLE operator */ TABLESAMPLE, /** * MATCH_RECOGNIZE clause */ MATCH_RECOGNIZE, /** * SNAPSHOT operator */ SNAPSHOT, // binary operators /** * The arithmetic multiplication operator, "*". */ TIMES, /** * The arithmetic division operator, "/". */ DIVIDE, /** * The arithmetic remainder operator, "MOD" (and "%" in some dialects). */ MOD, /** * The arithmetic plus operator, "+". * * @see #PLUS_PREFIX */ PLUS, /** * The arithmetic minus operator, "-". * * @see #MINUS_PREFIX */ MINUS, /** * the alternation operator in a pattern expression within a match_recognize clause */ PATTERN_ALTER, /** * the concatenation operator in a pattern expression within a match_recognize clause */ PATTERN_CONCAT, // comparison operators /** * The "IN" operator. */ IN, /** * The "NOT IN" operator. * *

Only occurs in SqlNode trees. Is expanded to NOT(IN ...) before * entering RelNode land. */ NOT_IN("NOT IN"), /** * The less-than operator, "<". */ LESS_THAN("<"), /** * The greater-than operator, ">". */ GREATER_THAN(">"), /** * The less-than-or-equal operator, "<=". */ LESS_THAN_OR_EQUAL("<="), /** * The greater-than-or-equal operator, ">=". */ GREATER_THAN_OR_EQUAL(">="), /** * The equals operator, "=". */ EQUALS("="), /** * The not-equals operator, "!=" or "<>". * The latter is standard, and preferred. */ NOT_EQUALS("<>"), /** * The is-distinct-from operator. */ IS_DISTINCT_FROM, /** * The is-not-distinct-from operator. */ IS_NOT_DISTINCT_FROM, /** * The logical "OR" operator. */ OR, /** * The logical "AND" operator. */ AND, // other infix /** * Dot */ DOT, /** * The "OVERLAPS" operator for periods. */ OVERLAPS, /** * The "CONTAINS" operator for periods. */ CONTAINS, /** * The "PRECEDES" operator for periods. */ PRECEDES, /** * The "IMMEDIATELY PRECEDES" operator for periods. */ IMMEDIATELY_PRECEDES("IMMEDIATELY PRECEDES"), /** * The "SUCCEEDS" operator for periods. */ SUCCEEDS, /** * The "IMMEDIATELY SUCCEEDS" operator for periods. */ IMMEDIATELY_SUCCEEDS("IMMEDIATELY SUCCEEDS"), /** * The "EQUALS" operator for periods. */ PERIOD_EQUALS("EQUALS"), /** * The "LIKE" operator. */ LIKE, /** * The "SIMILAR" operator. */ SIMILAR, /** * The "~" operator. */ POSIX_REGEX_CASE_SENSITIVE, /** * The "~*" operator. */ POSIX_REGEX_CASE_INSENSITIVE, /** * The "BETWEEN" operator. */ BETWEEN, /** * A "CASE" expression. */ CASE, /** * The "NULLIF" operator. */ NULLIF, /** * The "COALESCE" operator. */ COALESCE, /** * The "DECODE" function (Oracle). */ DECODE, /** * The "NVL" function (Oracle). */ NVL, /** * The "GREATEST" function (Oracle). */ GREATEST, /** * The "LEAST" function (Oracle). */ LEAST, /** * The "TIMESTAMP_ADD" function (ODBC, SQL Server, MySQL). */ TIMESTAMP_ADD, /** * The "TIMESTAMP_DIFF" function (ODBC, SQL Server, MySQL). */ TIMESTAMP_DIFF, // prefix operators /** * The logical "NOT" operator. */ NOT, /** * The unary plus operator, as in "+1". * * @see #PLUS */ PLUS_PREFIX, /** * The unary minus operator, as in "-1". * * @see #MINUS */ MINUS_PREFIX, /** * The "EXISTS" operator. */ EXISTS, /** * The "SOME" quantification operator (also called "ANY"). */ SOME, /** * The "ALL" quantification operator. */ ALL, /** * The "VALUES" operator. */ VALUES, /** * Explicit table, e.g. select * from (TABLE t) or TABLE * t. See also {@link #COLLECTION_TABLE}. */ EXPLICIT_TABLE, /** * Scalar query; that is, a sub-query used in an expression context, and * returning one row and one column. */ SCALAR_QUERY, /** * ProcedureCall */ PROCEDURE_CALL, /** * NewSpecification */ NEW_SPECIFICATION, /** * Special functions in MATCH_RECOGNIZE. */ FINAL, RUNNING, PREV, NEXT, FIRST, LAST, CLASSIFIER, MATCH_NUMBER, /** * The "SKIP TO FIRST" qualifier of restarting point in a MATCH_RECOGNIZE * clause. */ SKIP_TO_FIRST, /** * The "SKIP TO LAST" qualifier of restarting point in a MATCH_RECOGNIZE * clause. */ SKIP_TO_LAST, // postfix operators /** * DESC in ORDER BY. A parse tree, not a true expression. */ DESCENDING, /** * NULLS FIRST clause in ORDER BY. A parse tree, not a true expression. */ NULLS_FIRST, /** * NULLS LAST clause in ORDER BY. A parse tree, not a true expression. */ NULLS_LAST, /** * The "IS TRUE" operator. */ IS_TRUE, /** * The "IS FALSE" operator. */ IS_FALSE, /** * The "IS NOT TRUE" operator. */ IS_NOT_TRUE, /** * The "IS NOT FALSE" operator. */ IS_NOT_FALSE, /** * The "IS UNKNOWN" operator. */ IS_UNKNOWN, /** * The "IS NULL" operator. */ IS_NULL, /** * The "IS NOT NULL" operator. */ IS_NOT_NULL, /** * The "PRECEDING" qualifier of an interval end-point in a window * specification. */ PRECEDING, /** * The "FOLLOWING" qualifier of an interval end-point in a window * specification. */ FOLLOWING, /** * The field access operator, ".". * *

(Only used at the RexNode level; at * SqlNode level, a field-access is part of an identifier.)

*/ FIELD_ACCESS, /** * Reference to an input field. * *

(Only used at the RexNode level.)

*/ INPUT_REF, /** * Reference to an input field, with a qualified name and an identifier * *

(Only used at the RexNode level.)

*/ TABLE_INPUT_REF, /** * Reference to an input field, with pattern var as modifier * *

(Only used at the RexNode level.)

*/ PATTERN_INPUT_REF, /** * Reference to a sub-expression computed within the current relational * operator. * *

(Only used at the RexNode level.)

*/ LOCAL_REF, /** * Reference to correlation variable. * *

(Only used at the RexNode level.)

*/ CORREL_VARIABLE, /** * the repetition quantifier of a pattern factor in a match_recognize clause. */ PATTERN_QUANTIFIER, // functions /** * The row-constructor function. May be explicit or implicit: * {@code VALUES 1, ROW (2)}. */ ROW, /** * The non-standard constructor used to pass a * COLUMN_LIST parameter to a user-defined transform. */ COLUMN_LIST, /** * The "CAST" operator, and also the PostgreSQL-style infix cast operator * "::". */ CAST, /** * The "NEXT VALUE OF sequence" operator. */ NEXT_VALUE, /** * The "CURRENT VALUE OF sequence" operator. */ CURRENT_VALUE, /** * The "FLOOR" function */ FLOOR, /** * The "CEIL" function */ CEIL, /** * The "TRIM" function. */ TRIM, /** * The "LTRIM" function (Oracle). */ LTRIM, /** * The "RTRIM" function (Oracle). */ RTRIM, /** * The "EXTRACT" function. */ EXTRACT, /** * The "REVERSE" function (SQL Server, MySQL). */ REVERSE, /** * Call to a function using JDBC function syntax. */ JDBC_FN, /** * The MULTISET value constructor. */ MULTISET_VALUE_CONSTRUCTOR, /** * The MULTISET query constructor. */ MULTISET_QUERY_CONSTRUCTOR, /** * The JSON value expression. */ JSON_VALUE_EXPRESSION, /** * The {@code JSON_ARRAYAGG} aggregate function. */ JSON_ARRAYAGG, /** * The {@code JSON_OBJECTAGG} aggregate function. */ JSON_OBJECTAGG, /** * The "UNNEST" operator. */ UNNEST, /** * The "LATERAL" qualifier to relations in the FROM clause. */ LATERAL, /** * Table operator which converts user-defined transform into a relation, for * example, select * from TABLE(udx(x, y, z)). See also the * {@link #EXPLICIT_TABLE} prefix operator. */ COLLECTION_TABLE, /** * Array Value Constructor, e.g. {@code Array[1, 2, 3]}. */ ARRAY_VALUE_CONSTRUCTOR, /** * Array Query Constructor, e.g. {@code Array(select deptno from dept)}. */ ARRAY_QUERY_CONSTRUCTOR, /** * Map Value Constructor, e.g. {@code Map['washington', 1, 'obama', 44]}. */ MAP_VALUE_CONSTRUCTOR, /** * Map Query Constructor, e.g. {@code MAP (SELECT empno, deptno FROM emp)}. */ MAP_QUERY_CONSTRUCTOR, /** * CURSOR constructor, for example, select * from * TABLE(udx(CURSOR(select ...), x, y, z)) */ CURSOR, // internal operators (evaluated in validator) 200-299 /** * Literal chain operator (for composite string literals). * An internal operator that does not appear in SQL syntax. */ LITERAL_CHAIN, /** * Escape operator (always part of LIKE or SIMILAR TO expression). * An internal operator that does not appear in SQL syntax. */ ESCAPE, /** * The internal REINTERPRET operator (meaning a reinterpret cast). * An internal operator that does not appear in SQL syntax. */ REINTERPRET, /** The internal {@code EXTEND} operator that qualifies a table name in the * {@code FROM} clause. */ EXTEND, /** The internal {@code CUBE} operator that occurs within a {@code GROUP BY} * clause. */ CUBE, /** The internal {@code ROLLUP} operator that occurs within a {@code GROUP BY} * clause. */ ROLLUP, /** The internal {@code GROUPING SETS} operator that occurs within a * {@code GROUP BY} clause. */ GROUPING_SETS, /** The {@code GROUPING(e, ...)} function. */ GROUPING, /** @deprecated Use {@link #GROUPING}. */ @Deprecated // to be removed before 2.0 GROUPING_ID, /** The {@code GROUP_ID()} function. */ GROUP_ID, /** The internal "permute" function in a MATCH_RECOGNIZE clause. */ PATTERN_PERMUTE, /** The special patterns to exclude enclosing pattern from output in a * MATCH_RECOGNIZE clause. */ PATTERN_EXCLUDED, // Aggregate functions /** The {@code COUNT} aggregate function. */ COUNT, /** The {@code SUM} aggregate function. */ SUM, /** The {@code SUM0} aggregate function. */ SUM0, /** The {@code MIN} aggregate function. */ MIN, /** The {@code MAX} aggregate function. */ MAX, /** The {@code LEAD} aggregate function. */ LEAD, /** The {@code LAG} aggregate function. */ LAG, /** The {@code FIRST_VALUE} aggregate function. */ FIRST_VALUE, /** The {@code LAST_VALUE} aggregate function. */ LAST_VALUE, /** The {@code ANY_VALUE} aggregate function. */ ANY_VALUE, /** The {@code COVAR_POP} aggregate function. */ COVAR_POP, /** The {@code COVAR_SAMP} aggregate function. */ COVAR_SAMP, /** The {@code REGR_COUNT} aggregate function. */ REGR_COUNT, /** The {@code REGR_SXX} aggregate function. */ REGR_SXX, /** The {@code REGR_SYY} aggregate function. */ REGR_SYY, /** The {@code AVG} aggregate function. */ AVG, /** The {@code STDDEV_POP} aggregate function. */ STDDEV_POP, /** The {@code STDDEV_SAMP} aggregate function. */ STDDEV_SAMP, /** The {@code VAR_POP} aggregate function. */ VAR_POP, /** The {@code VAR_SAMP} aggregate function. */ VAR_SAMP, /** The {@code NTILE} aggregate function. */ NTILE, /** The {@code NTH_VALUE} aggregate function. */ NTH_VALUE, /** The {@code LISTAGG} aggregate function. */ LISTAGG, /** The {@code COLLECT} aggregate function. */ COLLECT, /** The {@code FUSION} aggregate function. */ FUSION, /** The {@code INTERSECTION} aggregate function. */ INTERSECTION, /** The {@code SINGLE_VALUE} aggregate function. */ SINGLE_VALUE, /** The {@code BIT_AND} aggregate function. */ BIT_AND, /** The {@code BIT_OR} aggregate function. */ BIT_OR, /** The {@code BIT_XOR} aggregate function. */ BIT_XOR, /** The {@code ROW_NUMBER} window function. */ ROW_NUMBER, /** The {@code RANK} window function. */ RANK, /** The {@code PERCENT_RANK} window function. */ PERCENT_RANK, /** The {@code DENSE_RANK} window function. */ DENSE_RANK, /** The {@code ROW_NUMBER} window function. */ CUME_DIST, /** The {@code DESCRIPTOR(column_name, ...)}. */ DESCRIPTOR, /** The {@code TUMBLE} group function. */ TUMBLE, // Group functions /** The {@code TUMBLE_START} auxiliary function of * the {@link #TUMBLE} group function. */ // TODO: deprecate TUMBLE_START. TUMBLE_START, /** The {@code TUMBLE_END} auxiliary function of * the {@link #TUMBLE} group function. */ // TODO: deprecate TUMBLE_END. TUMBLE_END, /** The {@code HOP} group function. */ HOP, /** The {@code HOP_START} auxiliary function of * the {@link #HOP} group function. */ HOP_START, /** The {@code HOP_END} auxiliary function of * the {@link #HOP} group function. */ HOP_END, /** The {@code SESSION} group function. */ SESSION, /** The {@code SESSION_START} auxiliary function of * the {@link #SESSION} group function. */ SESSION_START, /** The {@code SESSION_END} auxiliary function of * the {@link #SESSION} group function. */ SESSION_END, /** Column declaration. */ COLUMN_DECL, /** Attribute definition. */ ATTRIBUTE_DEF, /** {@code CHECK} constraint. */ CHECK, /** {@code UNIQUE} constraint. */ UNIQUE, /** {@code PRIMARY KEY} constraint. */ PRIMARY_KEY, /** {@code FOREIGN KEY} constraint. */ FOREIGN_KEY, // DDL and session control statements follow. The list is not exhaustive: feel // free to add more. /** {@code COMMIT} session control statement. */ COMMIT, /** {@code ROLLBACK} session control statement. */ ROLLBACK, /** {@code ALTER SESSION} DDL statement. */ ALTER_SESSION, /** {@code CREATE SCHEMA} DDL statement. */ CREATE_SCHEMA, /** {@code CREATE FOREIGN SCHEMA} DDL statement. */ CREATE_FOREIGN_SCHEMA, /** {@code DROP SCHEMA} DDL statement. */ DROP_SCHEMA, /** {@code CREATE TABLE} DDL statement. */ CREATE_TABLE, /** {@code ALTER TABLE} DDL statement. */ ALTER_TABLE, /** {@code DROP TABLE} DDL statement. */ DROP_TABLE, /** {@code CREATE VIEW} DDL statement. */ CREATE_VIEW, /** {@code ALTER VIEW} DDL statement. */ ALTER_VIEW, /** {@code DROP VIEW} DDL statement. */ DROP_VIEW, /** {@code CREATE MATERIALIZED VIEW} DDL statement. */ CREATE_MATERIALIZED_VIEW, /** {@code ALTER MATERIALIZED VIEW} DDL statement. */ ALTER_MATERIALIZED_VIEW, /** {@code DROP MATERIALIZED VIEW} DDL statement. */ DROP_MATERIALIZED_VIEW, /** {@code CREATE SEQUENCE} DDL statement. */ CREATE_SEQUENCE, /** {@code ALTER SEQUENCE} DDL statement. */ ALTER_SEQUENCE, /** {@code DROP SEQUENCE} DDL statement. */ DROP_SEQUENCE, /** {@code CREATE INDEX} DDL statement. */ CREATE_INDEX, /** {@code ALTER INDEX} DDL statement. */ ALTER_INDEX, /** {@code DROP INDEX} DDL statement. */ DROP_INDEX, /** {@code CREATE TYPE} DDL statement. */ CREATE_TYPE, /** {@code DROP TYPE} DDL statement. */ DROP_TYPE, /** {@code CREATE FUNCTION} DDL statement. */ CREATE_FUNCTION, /** {@code DROP FUNCTION} DDL statement. */ DROP_FUNCTION, /** DDL statement not handled above. * *

Note to other projects: If you are extending Calcite's SQL parser * and have your own object types you no doubt want to define CREATE and DROP * commands for them. Use OTHER_DDL in the short term, but we are happy to add * new enum values for your object types. Just ask! */ OTHER_DDL; //~ Static fields/initializers --------------------------------------------- // Most of the static fields are categories, aggregating several kinds into // a set. /** * Category consisting of set-query node types. * *

Consists of: * {@link #EXCEPT}, * {@link #INTERSECT}, * {@link #UNION}. */ public static final EnumSet SET_QUERY = EnumSet.of(UNION, INTERSECT, EXCEPT); /** * Category consisting of all built-in aggregate functions. */ public static final EnumSet AGGREGATE = EnumSet.of(COUNT, SUM, SUM0, MIN, MAX, LEAD, LAG, FIRST_VALUE, LAST_VALUE, COVAR_POP, COVAR_SAMP, REGR_COUNT, REGR_SXX, REGR_SYY, AVG, STDDEV_POP, STDDEV_SAMP, VAR_POP, VAR_SAMP, NTILE, COLLECT, FUSION, SINGLE_VALUE, ROW_NUMBER, RANK, PERCENT_RANK, DENSE_RANK, CUME_DIST, JSON_ARRAYAGG, JSON_OBJECTAGG, BIT_AND, BIT_OR, BIT_XOR, LISTAGG, INTERSECTION, ANY_VALUE); /** * Category consisting of all DML operators. * *

Consists of: * {@link #INSERT}, * {@link #UPDATE}, * {@link #DELETE}, * {@link #MERGE}, * {@link #PROCEDURE_CALL}. * *

NOTE jvs 1-June-2006: For now we treat procedure calls as DML; * this makes it easy for JDBC clients to call execute or * executeUpdate and not have to process dummy cursor results. If * in the future we support procedures which return results sets, * we'll need to refine this. */ public static final EnumSet DML = EnumSet.of(INSERT, DELETE, UPDATE, MERGE, PROCEDURE_CALL); /** * Category consisting of all DDL operators. */ public static final EnumSet DDL = EnumSet.of(COMMIT, ROLLBACK, ALTER_SESSION, CREATE_SCHEMA, CREATE_FOREIGN_SCHEMA, DROP_SCHEMA, CREATE_TABLE, ALTER_TABLE, DROP_TABLE, CREATE_FUNCTION, DROP_FUNCTION, CREATE_VIEW, ALTER_VIEW, DROP_VIEW, CREATE_MATERIALIZED_VIEW, ALTER_MATERIALIZED_VIEW, DROP_MATERIALIZED_VIEW, CREATE_SEQUENCE, ALTER_SEQUENCE, DROP_SEQUENCE, CREATE_INDEX, ALTER_INDEX, DROP_INDEX, CREATE_TYPE, DROP_TYPE, SET_OPTION, OTHER_DDL); /** * Category consisting of query node types. * *

Consists of: * {@link #SELECT}, * {@link #EXCEPT}, * {@link #INTERSECT}, * {@link #UNION}, * {@link #VALUES}, * {@link #ORDER_BY}, * {@link #EXPLICIT_TABLE}. */ public static final EnumSet QUERY = EnumSet.of(SELECT, UNION, INTERSECT, EXCEPT, VALUES, WITH, ORDER_BY, EXPLICIT_TABLE); /** * Category consisting of all expression operators. * *

A node is an expression if it is NOT one of the following: * {@link #AS}, * {@link #ARGUMENT_ASSIGNMENT}, * {@link #DEFAULT}, * {@link #DESCENDING}, * {@link #SELECT}, * {@link #JOIN}, * {@link #OTHER_FUNCTION}, * {@link #CAST}, * {@link #TRIM}, * {@link #LITERAL_CHAIN}, * {@link #JDBC_FN}, * {@link #PRECEDING}, * {@link #FOLLOWING}, * {@link #ORDER_BY}, * {@link #COLLECTION_TABLE}, * {@link #TABLESAMPLE}, * or an aggregate function, DML or DDL. */ public static final Set EXPRESSION = EnumSet.complementOf( concat( EnumSet.of(AS, ARGUMENT_ASSIGNMENT, DEFAULT, RUNNING, FINAL, LAST, FIRST, PREV, NEXT, FILTER, WITHIN_GROUP, IGNORE_NULLS, RESPECT_NULLS, DESCENDING, CUBE, ROLLUP, GROUPING_SETS, EXTEND, LATERAL, SELECT, JOIN, OTHER_FUNCTION, POSITION, CAST, TRIM, FLOOR, CEIL, TIMESTAMP_ADD, TIMESTAMP_DIFF, EXTRACT, LITERAL_CHAIN, JDBC_FN, PRECEDING, FOLLOWING, ORDER_BY, NULLS_FIRST, NULLS_LAST, COLLECTION_TABLE, TABLESAMPLE, VALUES, WITH, WITH_ITEM, ITEM, SKIP_TO_FIRST, SKIP_TO_LAST, JSON_VALUE_EXPRESSION), AGGREGATE, DML, DDL)); /** * Category of all SQL statement types. * *

Consists of all types in {@link #QUERY}, {@link #DML} and {@link #DDL}. */ public static final EnumSet TOP_LEVEL = concat(QUERY, DML, DDL); /** * Category consisting of regular and special functions. * *

Consists of regular functions {@link #OTHER_FUNCTION} and special * functions {@link #ROW}, {@link #TRIM}, {@link #CAST}, {@link #REVERSE}, {@link #JDBC_FN}. */ public static final Set FUNCTION = EnumSet.of(OTHER_FUNCTION, ROW, TRIM, LTRIM, RTRIM, CAST, REVERSE, JDBC_FN, POSITION); /** * Category of SqlAvgAggFunction. * *

Consists of {@link #AVG}, {@link #STDDEV_POP}, {@link #STDDEV_SAMP}, * {@link #VAR_POP}, {@link #VAR_SAMP}. */ public static final Set AVG_AGG_FUNCTIONS = EnumSet.of(AVG, STDDEV_POP, STDDEV_SAMP, VAR_POP, VAR_SAMP); /** * Category of SqlCovarAggFunction. * *

Consists of {@link #COVAR_POP}, {@link #COVAR_SAMP}, {@link #REGR_SXX}, * {@link #REGR_SYY}. */ public static final Set COVAR_AVG_AGG_FUNCTIONS = EnumSet.of(COVAR_POP, COVAR_SAMP, REGR_COUNT, REGR_SXX, REGR_SYY); /** * Category of comparison operators. * *

Consists of: * {@link #IN}, * {@link #EQUALS}, * {@link #NOT_EQUALS}, * {@link #LESS_THAN}, * {@link #GREATER_THAN}, * {@link #LESS_THAN_OR_EQUAL}, * {@link #GREATER_THAN_OR_EQUAL}. */ public static final Set COMPARISON = EnumSet.of( IN, EQUALS, NOT_EQUALS, LESS_THAN, GREATER_THAN, GREATER_THAN_OR_EQUAL, LESS_THAN_OR_EQUAL); /** * Category of binary arithmetic. * *

Consists of: * {@link #PLUS} * {@link #MINUS} * {@link #TIMES} * {@link #DIVIDE} * {@link #MOD}. */ public static final Set BINARY_ARITHMETIC = EnumSet.of(PLUS, MINUS, TIMES, DIVIDE, MOD); /** * Category of binary equality. * *

Consists of: * {@link #EQUALS} * {@link #NOT_EQUALS} */ public static final Set BINARY_EQUALITY = EnumSet.of(EQUALS, NOT_EQUALS); /** * Category of binary comparison. * *

Consists of: * {@link #EQUALS} * {@link #NOT_EQUALS} * {@link #GREATER_THAN} * {@link #GREATER_THAN_OR_EQUAL} * {@link #LESS_THAN} * {@link #LESS_THAN_OR_EQUAL} * {@link #IS_DISTINCT_FROM} * {@link #IS_NOT_DISTINCT_FROM} */ public static final Set BINARY_COMPARISON = EnumSet.of( EQUALS, NOT_EQUALS, GREATER_THAN, GREATER_THAN_OR_EQUAL, LESS_THAN, LESS_THAN_OR_EQUAL, IS_DISTINCT_FROM, IS_NOT_DISTINCT_FROM); /** * Category of operators that do not depend on the argument order. * *

For instance: {@link #AND}, {@link #OR}, {@link #EQUALS}, {@link #LEAST}

*

Note: {@link #PLUS} does depend on the argument oder if argument types are different

*/ @API(since = "1.22", status = API.Status.EXPERIMENTAL) public static final Set SYMMETRICAL = EnumSet.of( AND, OR, EQUALS, NOT_EQUALS, IS_DISTINCT_FROM, IS_NOT_DISTINCT_FROM, GREATEST, LEAST); /** * Category of operators that do not depend on the argument order if argument types are equal. * *

For instance: {@link #PLUS}, {@link #TIMES}

*/ @API(since = "1.22", status = API.Status.EXPERIMENTAL) public static final Set SYMMETRICAL_SAME_ARG_TYPE = EnumSet.of( PLUS, TIMES); /** Lower-case name. */ public final String lowerName = name().toLowerCase(Locale.ROOT); public final String sql; SqlKind() { sql = name(); } SqlKind(String sql) { this.sql = sql; } /** Returns the kind that corresponds to this operator but in the opposite * direction. Or returns this, if this kind is not reversible. * *

For example, {@code GREATER_THAN.reverse()} returns {@link #LESS_THAN}. */ public SqlKind reverse() { switch (this) { case GREATER_THAN: return LESS_THAN; case GREATER_THAN_OR_EQUAL: return LESS_THAN_OR_EQUAL; case LESS_THAN: return GREATER_THAN; case LESS_THAN_OR_EQUAL: return GREATER_THAN_OR_EQUAL; default: return this; } } /** Returns the kind that you get if you apply NOT to this kind. * *

For example, {@code IS_NOT_NULL.negate()} returns {@link #IS_NULL}. * *

For {@link #IS_TRUE}, {@link #IS_FALSE}, {@link #IS_NOT_TRUE}, * {@link #IS_NOT_FALSE}, nullable inputs need to be treated carefully. * *

{@code NOT(IS_TRUE(null))} = {@code NOT(false)} = {@code true}, * while {@code IS_FALSE(null)} = {@code false}, * so {@code NOT(IS_TRUE(X))} should be {@code IS_NOT_TRUE(X)}. * On the other hand, * {@code IS_TRUE(NOT(null))} = {@code IS_TRUE(null)} = {@code false}. * *

This is why negate() != negateNullSafe() for these operators. */ public SqlKind negate() { switch (this) { case IS_TRUE: return IS_NOT_TRUE; case IS_FALSE: return IS_NOT_FALSE; case IS_NULL: return IS_NOT_NULL; case IS_NOT_TRUE: return IS_TRUE; case IS_NOT_FALSE: return IS_FALSE; case IS_NOT_NULL: return IS_NULL; case IS_DISTINCT_FROM: return IS_NOT_DISTINCT_FROM; case IS_NOT_DISTINCT_FROM: return IS_DISTINCT_FROM; default: return this; } } /** Returns the kind that you get if you negate this kind. * To conform to null semantics, null value should not be compared. * *

For {@link #IS_TRUE}, {@link #IS_FALSE}, {@link #IS_NOT_TRUE} and * {@link #IS_NOT_FALSE}, nullable inputs need to be treated carefully: * *

    *
  • NOT(IS_TRUE(null)) = NOT(false) = true *
  • IS_TRUE(NOT(null)) = IS_TRUE(null) = false *
  • IS_FALSE(null) = false *
  • IS_NOT_TRUE(null) = true *
*/ public SqlKind negateNullSafe() { switch (this) { case EQUALS: return NOT_EQUALS; case NOT_EQUALS: return EQUALS; case LESS_THAN: return GREATER_THAN_OR_EQUAL; case GREATER_THAN: return LESS_THAN_OR_EQUAL; case LESS_THAN_OR_EQUAL: return GREATER_THAN; case GREATER_THAN_OR_EQUAL: return LESS_THAN; case IS_TRUE: return IS_FALSE; case IS_FALSE: return IS_TRUE; case IS_NOT_TRUE: return IS_NOT_FALSE; case IS_NOT_FALSE: return IS_NOT_TRUE; // (NOT x) IS NULL => x IS NULL // Similarly (NOT x) IS NOT NULL => x IS NOT NULL case IS_NOT_NULL: case IS_NULL: return this; default: return this.negate(); } } /** * Returns whether this {@code SqlKind} belongs to a given category. * *

A category is a collection of kinds, not necessarily disjoint. For * example, QUERY is { SELECT, UNION, INTERSECT, EXCEPT, VALUES, ORDER_BY, * EXPLICIT_TABLE }. * * @param category Category * @return Whether this kind belongs to the given category */ public final boolean belongsTo(Collection category) { return category.contains(this); } @SafeVarargs private static > EnumSet concat(EnumSet set0, EnumSet... sets) { EnumSet set = set0.clone(); for (EnumSet s : sets) { set.addAll(s); } return set; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy