Class SqlDataTypeSpec

java.lang.Object
org.apache.calcite.sql.SqlNode
org.apache.calcite.sql.SqlDataTypeSpec
All Implemented Interfaces:
Cloneable

public class SqlDataTypeSpec extends SqlNode
Represents a SQL data type specification in a parse tree.

A SqlDataTypeSpec is immutable; once created, you cannot change any of the fields.

We support the following data type expressions:

  • Complex data type expression like:
    ROW(
    foo NUMBER(5, 2) NOT NULL,
    rec ROW(b BOOLEAN, i MyUDT NOT NULL))
    Internally we use SqlRowTypeNameSpec to specify row data type name.
  • Simple data type expression like CHAR, VARCHAR and DOUBLE with optional precision and scale; Internally we use SqlBasicTypeNameSpec to specify basic sql data type name.
  • Collection data type expression like:
    INT ARRAY; VARCHAR(20) MULTISET; INT ARRAY MULTISET;
    Internally we use SqlCollectionTypeNameSpec to specify collection data type name.
  • User defined data type expression like `My_UDT`; Internally we use SqlUserDefinedTypeNameSpec to specify user defined data type name.
  • Constructor Details

    • SqlDataTypeSpec

      public SqlDataTypeSpec(SqlTypeNameSpec typeNameSpec, SqlParserPos pos)
      Creates a type specification representing a type.
      Parameters:
      typeNameSpec - The type name can be basic sql type, row type, collections type and user defined type
    • SqlDataTypeSpec

      public SqlDataTypeSpec(SqlTypeNameSpec typeNameSpec, @Nullable TimeZone timeZone, SqlParserPos pos)
      Creates a type specification representing a type, with time zone specified.
      Parameters:
      typeNameSpec - The type name can be basic sql type, row type, collections type and user defined type
      timeZone - Specified time zone
    • SqlDataTypeSpec

      public SqlDataTypeSpec(SqlTypeNameSpec typeNameSpec, @Nullable TimeZone timeZone, @Nullable Boolean nullable, SqlParserPos pos)
      Creates a type specification representing a type, with time zone, nullability and base type name specified.
      Parameters:
      typeNameSpec - The type name can be basic sql type, row type, collections type and user defined type
      timeZone - Specified time zone
      nullable - The nullability
  • Method Details

    • clone

      public SqlNode clone(SqlParserPos pos)
      Description copied from class: SqlNode
      Clones a SqlNode with a different position.
      Specified by:
      clone in class SqlNode
    • getMonotonicity

      public SqlMonotonicity getMonotonicity(SqlValidatorScope scope)
      Description copied from class: SqlNode
      Returns whether expression is always ascending, descending or constant. This property is useful because it allows to safely aggregate infinite streams of values.

      The default implementation returns SqlMonotonicity.NOT_MONOTONIC.

      Overrides:
      getMonotonicity in class SqlNode
      Parameters:
      scope - Scope
    • getCollectionsTypeName

      public @Nullable SqlIdentifier getCollectionsTypeName()
    • getTypeName

      public SqlIdentifier getTypeName()
    • getTypeNameSpec

      public SqlTypeNameSpec getTypeNameSpec()
    • getTimeZone

      public @Nullable TimeZone getTimeZone()
    • getNullable

      public @Nullable Boolean getNullable()
    • withNullable

      public SqlDataTypeSpec withNullable(Boolean nullable)
      Returns a copy of this data type specification with a given nullability.
    • withNullable

      public SqlDataTypeSpec withNullable(Boolean nullable, SqlParserPos pos)
      Returns a copy of this data type specification with a given nullability, extending the parser position.
    • getComponentTypeSpec

      public SqlDataTypeSpec getComponentTypeSpec()
      Returns a new SqlDataTypeSpec corresponding to the component type if the type spec is a collections type spec.
      Collection types are ARRAY and MULTISET.
    • unparse

      public void unparse(SqlWriter writer, int leftPrec, int rightPrec)
      Description copied from class: SqlNode
      Writes a SQL representation of this node to a writer.

      The leftPrec and rightPrec parameters give us enough context to decide whether we need to enclose the expression in parentheses. For example, we need parentheses around "2 + 3" if preceded by "5 *". This is because the precedence of the "*" operator is greater than the precedence of the "+" operator.

      The algorithm handles left- and right-associative operators by giving them slightly different left- and right-precedence.

      If SqlWriter.isAlwaysUseParentheses() is true, we use parentheses even when they are not required by the precedence rules.

      For the details of this algorithm, see SqlCall.unparse(org.apache.calcite.sql.SqlWriter, int, int).

      Specified by:
      unparse in class SqlNode
      Parameters:
      writer - Target writer
      leftPrec - The precedence of the SqlNode immediately preceding this node in a depth-first scan of the parse tree
      rightPrec - The precedence of the SqlNode immediately
    • validate

      public void validate(SqlValidator validator, SqlValidatorScope scope)
      Description copied from class: SqlNode
      Validates this node.

      The typical implementation of this method will make a callback to the validator appropriate to the node type and context. The validator has methods such as SqlValidator.validateLiteral(org.apache.calcite.sql.SqlLiteral) for these purposes.

      Specified by:
      validate in class SqlNode
      Parameters:
      scope - Validator
    • accept

      public <R> R accept(SqlVisitor<R> visitor)
      Description copied from class: SqlNode
      Accepts a generic visitor.

      Implementations of this method in subtypes simply call the appropriate visit method on the visitor object.

      The type parameter R must be consistent with the type parameter of the visitor.

      Specified by:
      accept in class SqlNode
    • equalsDeep

      public boolean equalsDeep(@Nullable SqlNode node, Litmus litmus)
      Description copied from class: SqlNode
      Returns whether this node is structurally equivalent to another node. Some examples:
      • 1 + 2 is structurally equivalent to 1 + 2
      • 1 + 2 + 3 is structurally equivalent to (1 + 2) + 3, but not to 1 + (2 + 3), because the '+' operator is left-associative
      Specified by:
      equalsDeep in class SqlNode
    • deriveType

      public RelDataType deriveType(SqlValidator validator)
      Converts this type specification to a RelDataType.

      Throws an error if the type is not found.

    • deriveType

      public RelDataType deriveType(SqlValidator validator, boolean nullable)
      Converts this type specification to a RelDataType.

      Throws an error if the type is not found.

      Parameters:
      nullable - Whether the type is nullable if the type specification does not explicitly state