Class SqlLiteral

  • All Implemented Interfaces:
    java.lang.Cloneable
    Direct Known Subclasses:
    SqlAbstractDateTimeLiteral, SqlAbstractStringLiteral, SqlIntervalLiteral, SqlNumericLiteral

    public class SqlLiteral
    extends SqlNode
    A SqlLiteral is a constant. It is, appropriately, immutable.

    How is the value stored? In that respect, the class is somewhat of a black box. There is a getValue() method which returns the value as an object, but the type of that value is implementation detail, and it is best that your code does not depend upon that knowledge. It is better to use task-oriented methods such as SqlNode.toSqlString(SqlDialect) and toValue().

    If you really need to access the value directly, you should switch on the value of the typeName field, rather than making assumptions about the runtime type of the value.

    The allowable types and combinations are:

    Allowable types for SqlLiteral
    TypeName Meaing Value type
    SqlTypeName.NULL The null value. It has its own special type. null
    SqlTypeName.BOOLEAN Boolean, namely TRUE, FALSE or UNKNOWN. Boolean, or null represents the UNKNOWN value
    SqlTypeName.DECIMAL Exact number, for example 0, -.5, 12345. BigDecimal
    SqlTypeName.DOUBLE Approximate number, for example 6.023E-23. BigDecimal
    SqlTypeName.DATE Date, for example DATE '1969-04'29' Calendar
    SqlTypeName.TIME Time, for example TIME '18:37:42.567' Calendar
    SqlTypeName.TIMESTAMP Timestamp, for example TIMESTAMP '1969-04-29 18:37:42.567' Calendar
    SqlTypeName.CHAR Character constant, for example 'Hello, world!', '', _N'Bonjour', _ISO-8859-1'It''s superman!' COLLATE SHIFT_JIS$ja_JP$2. These are always CHAR, never VARCHAR. NlsString
    SqlTypeName.BINARY Binary constant, for example X'ABC', X'7F'. Note that strings with an odd number of hexits will later become values of the BIT datatype, because they have an incomplete number of bytes. But here, they are all binary constants, because that's how they were written. These constants are always BINARY, never VARBINARY. BitString
    SqlTypeName.SYMBOL A symbol is a special type used to make parsing easier; it is not part of the SQL standard, and is not exposed to end-users. It is used to hold a symbol, such as the LEADING flag in a call to the function TRIM([LEADING|TRAILING|BOTH] chars FROM string). An Enum
    SqlTypeName.INTERVAL_YEAR .. SqlTypeName.INTERVAL_SECOND Interval, for example INTERVAL '1:34' HOUR. SqlIntervalLiteral.IntervalValue.
    • Constructor Detail

      • SqlLiteral

        protected SqlLiteral​(java.lang.Object value,
                             SqlTypeName typeName,
                             SqlParserPos pos)
        Creates a SqlLiteral.
    • Method Detail

      • valueMatchesType

        public static boolean valueMatchesType​(java.lang.Object value,
                                               SqlTypeName typeName)
        Returns:
        whether value is appropriate for its type (we have rules about these things)
      • getValue

        public java.lang.Object getValue()
        Returns the value of this literal.

        Try not to use this method! There are so many different kinds of values, it's better to to let SqlLiteral do whatever it is you want to do.

        See Also:
        booleanValue(), symbolValue(Class)
      • getValueAs

        public <T> T getValueAs​(java.lang.Class<T> clazz)
      • symbolValue_

        @Deprecated
        public <E extends java.lang.Enum<E>> E symbolValue_()
        Deprecated.
        Returns the value as a symbol.
      • symbolValue

        public <E extends java.lang.Enum<E>> E symbolValue​(java.lang.Class<E> class_)
        Returns the value as a symbol.
      • booleanValue

        public boolean booleanValue()
        Returns the value as a boolean.
      • value

        public static java.lang.Comparable value​(SqlNode node)
                                          throws java.lang.IllegalArgumentException
        Extracts the value from a literal.

        Cases:

        • If the node is a character literal, a chain of string literals, or a CAST of a character literal, returns the value as a NlsString.
        • If the node is a numeric literal, or a negated numeric literal, returns the value as a BigDecimal.
        • If the node is a SqlIntervalQualifier, returns its TimeUnitRange.
        • If the node is INTERVAL_DAY_TIME_ in SqlTypeFamily, returns its sign multiplied by its millisecond equivalent value
        • If the node is INTERVAL_YEAR_MONTH_ in SqlTypeFamily, returns its sign multiplied by its months equivalent value
        • Otherwise throws IllegalArgumentException.
        Throws:
        java.lang.IllegalArgumentException
      • stringValue

        @Deprecated
        public static java.lang.String stringValue​(SqlNode node)
        Deprecated.
        Extracts the string value from a string literal, a chain of string literals, or a CAST of a string literal.
      • unchain

        public static SqlLiteral unchain​(SqlNode node)
        Converts a chained string literals into regular literals; returns regular literals unchanged.
        Throws:
        java.lang.IllegalArgumentException - if node is not a string literal and cannot be unchained.
      • 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​(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
      • createNull

        public static SqlLiteral createNull​(SqlParserPos pos)
        Creates a NULL literal.

        There's no singleton constant for a NULL literal. Instead, nulls must be instantiated via createNull(), because different instances have different context-dependent types.

      • createBoolean

        public static SqlLiteral createBoolean​(boolean b,
                                               SqlParserPos pos)
        Creates a boolean literal.
      • createSymbol

        public static SqlLiteral createSymbol​(java.lang.Enum<?> o,
                                              SqlParserPos pos)
        Creates a literal which represents a parser symbol, for example the TRAILING keyword in the call Trim(TRAILING 'x' FROM 'Hello world!').
        See Also:
        symbolValue(Class)
      • equals

        public boolean equals​(java.lang.Object obj)
        Overrides:
        equals in class java.lang.Object
      • hashCode

        public int hashCode()
        Overrides:
        hashCode in class java.lang.Object
      • intValue

        public int intValue​(boolean exact)
        Returns the integer value of this literal.
        Parameters:
        exact - Whether the value has to be exact. If true, and the literal is a fraction (e.g. 3.14), throws. If false, discards the fractional part of the value.
        Returns:
        Integer value of this literal
      • longValue

        public long longValue​(boolean exact)
        Returns the long value of this literal.
        Parameters:
        exact - Whether the value has to be exact. If true, and the literal is a fraction (e.g. 3.14), throws. If false, discards the fractional part of the value.
        Returns:
        Long value of this literal
      • signum

        @Deprecated
        public int signum()
        Deprecated.
        Returns sign of value.
        Returns:
        -1, 0 or 1
      • bigDecimalValue

        public java.math.BigDecimal bigDecimalValue()
        Returns a numeric literal's value as a BigDecimal.
      • getStringValue

        @Deprecated
        public java.lang.String getStringValue()
        Deprecated.
      • 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
      • createDate

        @Deprecated
        public static SqlDateLiteral createDate​(java.util.Calendar calendar,
                                                SqlParserPos pos)
        Deprecated.
      • createTimestamp

        @Deprecated
        public static SqlTimestampLiteral createTimestamp​(java.util.Calendar calendar,
                                                          int precision,
                                                          SqlParserPos pos)
        Deprecated.
      • createTime

        @Deprecated
        public static SqlTimeLiteral createTime​(java.util.Calendar calendar,
                                                int precision,
                                                SqlParserPos pos)
        Deprecated.
      • createInterval

        public static SqlIntervalLiteral createInterval​(int sign,
                                                        java.lang.String intervalStr,
                                                        SqlIntervalQualifier intervalQualifier,
                                                        SqlParserPos pos)
        Creates an interval literal.
        Parameters:
        intervalStr - input string of '1:23:04'
        intervalQualifier - describes the interval type and precision
        pos - Parser position
      • createBinaryString

        public static SqlBinaryStringLiteral createBinaryString​(java.lang.String s,
                                                                SqlParserPos pos)
        Creates a literal like X'ABAB'. Although it matters when we derive a type for this beastie, we don't care at this point whether the number of hexits is odd or even.
      • createBinaryString

        public static SqlBinaryStringLiteral createBinaryString​(byte[] bytes,
                                                                SqlParserPos pos)
        Creates a literal like X'ABAB' from an array of bytes.
        Parameters:
        bytes - Contents of binary literal
        pos - Parser position
        Returns:
        Binary string literal
      • createCharString

        public static SqlCharStringLiteral createCharString​(java.lang.String s,
                                                            SqlParserPos pos)
        Creates a string literal in the system character set.
        Parameters:
        s - a string (without the sql single quotes)
        pos - Parser position
      • createCharString

        public static SqlCharStringLiteral createCharString​(java.lang.String s,
                                                            java.lang.String charSet,
                                                            SqlParserPos pos)
        Creates a string literal, with optional character-set.
        Parameters:
        s - a string (without the sql single quotes)
        charSet - character set name, null means take system default
        pos - Parser position
        Returns:
        A string literal
        Throws:
        java.nio.charset.UnsupportedCharsetException - if charSet is not null but there is no character set with that name in this environment
      • unescapeUnicode

        public SqlLiteral unescapeUnicode​(char unicodeEscapeChar)
        Transforms this literal (which must be of type character) into a new one in which 4-digit Unicode escape sequences have been replaced with the corresponding Unicode characters.
        Parameters:
        unicodeEscapeChar - escape character (e.g. backslash) for Unicode numeric sequences; 0 implies no transformation
        Returns:
        transformed literal