Conversion rules (original) (raw)

GoogleSQL for BigQuery supports conversion. Conversion includes, but isn't limited to, casting, coercion, and supertyping.

There are also conversions that have their own function names, such asPARSE_DATE(). To learn more about these functions, seeConversion functions.

Comparison of casting and coercion

The following table summarizes all possible cast and coercion possibilities for GoogleSQL data types. The Coerce to column applies to all expressions of a given data type, (for example, a column), but literals and parameters can also be coerced. Seeliteral coercion andparameter coercion for details.

From type Cast to Coerce to
INT64 BOOLINT64NUMERICBIGNUMERICFLOAT64STRING NUMERICBIGNUMERICFLOAT64
NUMERIC INT64NUMERICBIGNUMERICFLOAT64STRING BIGNUMERICFLOAT64
BIGNUMERIC INT64NUMERICBIGNUMERICFLOAT64STRING FLOAT64
FLOAT64 INT64NUMERICBIGNUMERICFLOAT64STRING
BOOL BOOLINT64STRING
STRING BOOLINT64NUMERICBIGNUMERICFLOAT64STRINGBYTESDATEDATETIMETIMETIMESTAMPRANGE
BYTES STRINGBYTES
DATE STRINGDATEDATETIMETIMESTAMP DATETIME
DATETIME STRINGDATEDATETIMETIMETIMESTAMP
TIME STRINGTIME
TIMESTAMP STRINGDATEDATETIMETIMETIMESTAMP
ARRAY ARRAY
STRUCT STRUCT
RANGE RANGESTRING

Casting

Most data types can be cast from one type to another with the CAST function. When using CAST, a query can fail if GoogleSQL is unable to perform the cast. If you want to protect your queries from these types of errors, you can use SAFE_CAST. To learn more about the rules for CAST, SAFE_CAST and other casting functions, seeConversion functions.

Coercion

GoogleSQL coerces the result type of an argument expression to another type if needed to match function signatures. For example, if function func()is defined to take a single argument of type FLOAT64and an expression is used as an argument that has a result type ofINT64, then the result of the expression will be coerced to FLOAT64 type before func() is computed.

Literal coercion

GoogleSQL supports the following literal coercions:

Input data type Result data type Notes
FLOAT64 literal NUMERIC Coercion may not be exact, and returns a close value.
STRING literal DATEDATETIMETIMETIMESTAMP

Literal coercion is needed when the actual literal type is different from the type expected by the function in question. For example, if function func() takes a DATE argument, then the expression func("2014-09-27") is valid because the string literal "2014-09-27" is coerced toDATE.

Literal conversion is evaluated at analysis time, and gives an error if the input literal can't be converted successfully to the target type.

Parameter coercion

GoogleSQL supports the following parameter coercions:

Input data type Result data type
STRING parameter DATEDATETIMETIMETIMESTAMP

If the parameter value can't be coerced successfully to the target type, an error is provided.

Supertypes

A supertype is a common type to which two or more expressions can be coerced. Supertypes are used with set operations such as UNION ALL and expressions such as CASE that expect multiple arguments with matching types. Each type has one or more supertypes, including itself, which defines its set of supertypes.

Input type Supertypes
BOOL BOOL
INT64 INT64FLOAT64NUMERICBIGNUMERIC
FLOAT64 FLOAT64
NUMERIC NUMERICBIGNUMERICFLOAT64
DECIMAL DECIMALBIGDECIMALFLOAT64
BIGNUMERIC BIGNUMERICFLOAT64
BIGDECIMAL BIGDECIMALFLOAT64
STRING STRING
DATE DATE
TIME TIME
DATETIME DATETIME
TIMESTAMP TIMESTAMP
BYTES BYTES
STRUCT STRUCT with the same field position types.
ARRAY ARRAY with the same element types.
GEOGRAPHY GEOGRAPHY
RANGE RANGE with the same subtype.

If you want to find the supertype for a set of input types, first determine the intersection of the set of supertypes for each input type. If that set is empty then the input types have no common supertype. If that set is non-empty, then the common supertype is generally themost specific type in that set. Generally, the most specific type is the type with the most restrictive domain.

Examples

Input types Common supertype Returns Notes
INT64FLOAT64 FLOAT64 FLOAT64 If you apply supertyping to INT64 andFLOAT64, supertyping succeeds because they they share a supertype,FLOAT64.
INT64BOOL None Error If you apply supertyping to INT64 and BOOL, supertyping fails because they don't share a common supertype.

Exact and inexact types

Numeric types can be exact or inexact. For supertyping, if all of the input types are exact types, then the resulting supertype can only be an exact type.

The following table contains a list of exact and inexact numeric data types.

Exact types Inexact types
INT64NUMERICBIGNUMERIC FLOAT64

Examples

Input types Common supertype Returns Notes
INT64FLOAT64 FLOAT64 FLOAT64 If supertyping is applied to INT64 and FLOAT64, supertyping succeeds because there are exact and inexact numeric types being supertyped.

Types specificity

Each type has a domain of values that it supports. A type with a narrow domain is more specific than a type with a wider domain. Exact types are more specific than inexact types because inexact types have a wider range of domain values that are supported than exact types. For example,INT64 is more specific than FLOAT64.

Supertypes and literals

Supertype rules for literals are more permissive than for normal expressions, and are consistent with implicit coercion rules. The following algorithm is used when the input set of types includes types related to literals:

Examples

Input types Common supertype Returns
INT64 literal UINT64 expression UINT64 UINT64
TIMESTAMP expression STRING literal TIMESTAMP TIMESTAMP
NULL literal NULL literal INT64 INT64
BOOL literal TIMESTAMP literal None Error