sql_utils/public/options.proto (903 lines of code) (raw):
//
// Copyright 2023 Google LLC
//
// Licensed 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.
//
syntax = "proto2";
package bigquery_ml_utils;
import "google/protobuf/descriptor.proto";
// SQL language versions.
// See (broken link) for more detail.
//
// A language version defines a stable set of features and required semantics.
// LanguageVersion VERSION_x_y implicitly includes the LanguageFeatures below
// named FEATURE_V_x_y_*.
//
// The features and behavior supported by an engine can be expressed as a
// LanguageVersion plus a set of LanguageFeatures added on top of that version.
//
// New version numbers will be introduced periodically, and will normally
// include the new features that have been specified up to that point.
// Engines should move their version number forwards over time rather than
// accumulating large sets of LanguageFeatures.
//
// LINT: LEGACY_NAMES
enum LanguageVersion {
// All current features, including features that are not part of a frozen
// version. For example, when v1.0 is the maximum released version number,
// this includes features that have been developed for v1.1.
// This does not include cross-version or experimental features.
// WARNING: Using this version means query behavior will change under you.
VERSION_CURRENT = 1;
VERSION_1_0 = 10000; // Version 1.0, frozen January 2015.
VERSION_1_1 = 11000; // Version 1.1, frozen February 2017.
VERSION_1_2 = 12000; // Version 1.2, frozen January 2018.
VERSION_1_3 = 13000; // Version 1.3, frozen May 2022.
VERSION_1_4 = 14000; // Version 1.4. Freeze May 2023 (12 mo)
// User code that switches on this enum must have a default case so
// builds won't break if new enums get added.
__LanguageVersion__switch_must_have_a_default__ = -1;
}
extend google.protobuf.EnumValueOptions {
// Only for use on LanguageFeature enum values.
optional LanguageFeatureOptions language_feature_options = 520370539;
// Only for use on ResolvedASTRewrite enum values.
optional ResolvedASTRewriteOptions rewrite_options = 452829176;
}
// Annotations for LanguageFeature enum values. Only for consumption by
// SQL code.
//
// LanguageOptions::EnableMaximumLanguageFeatures() enables all features with
// 'ideally_enabled == true' and 'in_development == false'.
//
// LanguageOptions::EnableMaximumLanguageFeaturesForDevelopment() enables all
// features with 'ideally_enabled == true'.
message LanguageFeatureOptions {
// Indicates whether a feature is enabled in the idealized SQL. (One
// reason to disable a feature is if it exists only to support backwards
// compatibility with older SQL behavior.)
optional bool ideally_enabled = 1 [default = true];
// Indicates whether a feature is still undergoing development. Users should
// not enable features that are still in development, but internal SQL
// tests may do so.
optional bool in_development = 2 [default = false];
}
// The list of optional features that engines may or may not support.
// Features can be opted into in AnalyzerOptions.
//
// There are three types of LanguageFeatures.
// * Cross-version - Optional features that can be enabled orthogonally to
// versioning. Some engines will never implement these
// features, and SQL code will always support this
// switch.
// * Versioned - Features that describe behavior changes adopted as of some
// language version. Eventually, all engines should support these
// features, and switches in the SQL code (and tests)
// should eventually be removed.
// All of these, and only these, show up in VERSION_CURRENT.
// * Experimental - Features not currently part of any language version.
//
// All optional features are off by default. Some features have a negative
// meaning, so turning them on will remove a feature or enable an error.
enum LanguageFeature {
reserved 36 to 39, 44 to 46, 48, 74, 13046, 14001, 999003;
// CROSS-VERSION FEATURES
//
// These are features that can be opted into independently from versioning.
// Some features may disable operations that are normally allowed by default.
//
// These features should not change semantics, other than whether a feature
// is allowed or not. Versioned options may further the behavior of these
// features, if they are enabled. For example, an engine may choose to
// support DML, orthogonally to versioning. If it supports DML, and
// specified semantics for DML may change over time, and the engine may use
// versioned options to choose DML behavior as of v1.0 or v1.1.
// Enable analytic functions.
// See (broken link).
FEATURE_ANALYTIC_FUNCTIONS = 1;
// Enable the TABLESAMPLE clause on scans.
// See (broken link).
FEATURE_TABLESAMPLE = 2;
// If enabled, give an error on GROUP BY, DISTINCT or set operations (other
// than UNION ALL) on floating point types. This feature is disabled in the
// idealized SQL (i.e. LanguageOptions::EnableMaximumLanguageFeatures)
// because enabling it turns off support for a feature that is normally on by
// default.
FEATURE_DISALLOW_GROUP_BY_FLOAT = 3
[(language_feature_options).ideally_enabled = false];
// If enabled, treats TIMESTAMP literal as 9 digits (nanos) precision.
// Otherwise TIMESTAMP has 6 digits (micros) precision.
// In general, a TIMESTAMP value has only 6 digits precision. This feature
// will only affect how a timestamp literal string is interpreted into a
// TIMESTAMP value. If enabled, a timestamp literal string can have up to 9
// digits of subseconds(nanos). Otherwise, it can only have up to 6 digits of
// subseconds (micros). 9 digits subsecond literal is not a valid timestamp
// string in the later case.
FEATURE_TIMESTAMP_NANOS = 5;
// Enable support for JOINs in UPDATE statements, see
// (broken link).
FEATURE_DML_UPDATE_WITH_JOIN = 6;
// Enable table-valued functions. For more information, see
// table_valued_functions.h.
FEATURE_TABLE_VALUED_FUNCTIONS = 8;
// This enables support for CREATE AGGREGATE FUNCTION.
FEATURE_CREATE_AGGREGATE_FUNCTION = 9;
// This enables support for CREATE TABLE FUNCTION.
// For more information, see (broken link).
FEATURE_CREATE_TABLE_FUNCTION = 10;
// This enables support for GROUP BY ROLLUP.
FEATURE_GROUP_BY_ROLLUP = 12;
// This enables support for creating and calling functions with templated
// argument types, using CREATE FUNCTION, CREATE AGGREGATE FUNCTION, or CREATE
// TABLE FUNCTION statements. For example, a function argument may be written
// as "argument ANY TYPE" to match against any scalar value. For more
// information, see (broken link).
FEATURE_TEMPLATE_FUNCTIONS = 13;
// Enables support for PARTITION BY with CREATE TABLE and CREATE TABLE AS.
// See (broken link).
FEATURE_CREATE_TABLE_PARTITION_BY = 14;
// Enables support for CLUSTER BY with CREATE TABLE and CREATE TABLE AS.
// See (broken link).
FEATURE_CREATE_TABLE_CLUSTER_BY = 15;
// NUMERIC type support, see (broken link).
FEATURE_NUMERIC_TYPE = 16;
// Enables support for NOT NULL annotation in CREATE TABLE.
// See comment on FEATURE_CREATE_TABLE_FIELD_ANNOTATIONS and
// (broken link) for details.
FEATURE_CREATE_TABLE_NOT_NULL = 17;
// Enables support for annotations (e.g., NOT NULL and OPTIONS()) for struct
// fields and array elements in CREATE TABLE.
// Does not affect table options or table column annotations.
//
// Example: Among the following queries
// Q1: CREATE TABLE t (c STRUCT<a INT64> NOT NULL)
// Q2: CREATE TABLE t (c STRUCT<a INT64 NOT NULL>)
// Q3: CREATE TABLE t (c STRUCT<a INT64> OPTIONS(foo=1))
// Q4: CREATE TABLE t (c STRUCT<a INT64 OPTIONS(foo=1)>)
// Q5: CREATE TABLE t (c STRUCT<a INT64 NOT NULL OPTIONS(foo=1)>)
//
// Allowed queries FEATURE_CREATE_TABLE_FIELD_ANNOTATIONS
// =0 =1
// FEATURE_CREATE_TABLE_NOT_NULL=0 {Q3} {Q3, Q4}
// FEATURE_CREATE_TABLE_NOT_NULL=1 {Q1, Q3} {Q1, Q2, Q3, Q4, Q5}
//
// See (broken link).
FEATURE_CREATE_TABLE_FIELD_ANNOTATIONS = 18;
// Enables support for column definition list in CREATE TABLE AS SELECT.
// Example: CREATE TABLE t (x FLOAT64) AS SELECT 1 x
// The features in the column definition list are controlled by
// FEATURE_CREATE_TABLE_NOT_NULL and FEATURE_CREATE_TABLE_FIELD_ANNOTATIONS.
FEATURE_CREATE_TABLE_AS_SELECT_COLUMN_LIST = 19;
// Indicates that an engine that supports primary keys does not allow any
// primary key column to be NULL. Similarly, non-NULL primary key columns
// cannot have any NULL array elements or struct/proto fields anywhere inside
// them.
//
// Only interpreted by the compliance tests and the reference implementation
// (not the analyzer). It exists so that engines can disable tests for this
// atypical behavior without impacting their compliance ratios. It can never
// be totally enforced in the analyzer because the analyzer cannot evaluate
// expressions.
FEATURE_DISALLOW_NULL_PRIMARY_KEYS = 20
[(language_feature_options).ideally_enabled = false];
// Indicates that an engine that supports primary keys does not allow any
// primary key column to be modified with UPDATE.
//
// Only interpreted by the compliance tests and the reference implementation
// (not the analyzer) for now. It exists so that engines can disable tests for
// this atypical behavior without impacting their compliance ratios.
FEATURE_DISALLOW_PRIMARY_KEY_UPDATES = 21
[(language_feature_options).ideally_enabled = false];
// Enables support for the TABLESAMPLE clause applied to table-valued function
// calls. For more information about table-valued functions, please see
// table_valued_functions.h and (broken link).
FEATURE_TABLESAMPLE_FROM_TABLE_VALUED_FUNCTIONS = 22;
// Enable encryption- and decryption-related functions.
// See (broken link).
FEATURE_ENCRYPTION = 23;
// Differentially private anonymization functions, syntax, and semantics.
// ((broken link)).
FEATURE_ANONYMIZATION = 24 [(language_feature_options).in_development = true];
// Geography type support per (broken link)
FEATURE_GEOGRAPHY = 25;
// Enables support for stratified TABLESAMPLE. For more information about
// stratified sampling, please see: (broken link).
FEATURE_STRATIFIED_RESERVOIR_TABLESAMPLE = 26;
// Enables foreign keys (see (broken link)).
FEATURE_FOREIGN_KEYS = 27;
// Enables BETWEEN function signatures for UINT64/INT64 comparisons.
FEATURE_BETWEEN_UINT64_INT64 = 28
[(language_feature_options).in_development = true];
// Enables check constraint (see (broken link)).
FEATURE_CHECK_CONSTRAINT = 29;
// Enables statement parameters and system variables in the GRANTEE list of
// GRANT, REVOKE, CREATE ROW POLICY, and ALTER ROW POLICY statements.
FEATURE_PARAMETERS_IN_GRANTEE_LIST = 30;
// Enables support for named arguments in function calls using a syntax like
// this: 'SELECT function(argname => 'value', otherarg => 42)'. Function
// arguments with associated names in the signature options may specify values
// by providing the argument name followed by an equals sign and greater than
// sign (=>) followed by a value for the argument. Function calls may include
// a mix of positional arguments and named arguments. The resolver will
// compare provided arguments against function signatures and handle signature
// matching appropriately. For more information, please refer to
// (broken link).
FEATURE_NAMED_ARGUMENTS = 31;
// Enables support for the old syntax for the DDL for ROW ACCESS POLICY,
// previously called ROW POLICY.
//
// When this feature is enabled, either the legacy or new syntax can be used
// for CREATE/DROP ROW [ACCESS] POLICY. Note, however, that when using the
// new syntax the GRANT TO clause is required (the GRANT TO clause is optional
// when the feature is off).
//
// When it is not enabled, the new syntax must be used for CREATE ROW ACCESS
// POLICY and DROP ALL ROW ACCESS POLICIES. The new syntax is always required
// for ALTER ROW ACCESS POLICY and DROP ROW ACCESS POLICY: at the time of this
// writing, these statements are new/not in use.
//
// This is a temporary feature that preserves legacy engine behavior that will
// be deprecated, and the new syntax will become mandatory. For
// more details on syntax changes, see (broken link).
FEATURE_ALLOW_LEGACY_ROW_ACCESS_POLICY_SYNTAX = 32;
// Enables support for PARTITION BY with CREATE MATERIALIZED VIEW.
// See (broken link).
FEATURE_CREATE_MATERIALIZED_VIEW_PARTITION_BY = 33;
// Enables support for CLUSTER BY with CREATE MATERIALIZED VIEW.
// See (broken link).
FEATURE_CREATE_MATERIALIZED_VIEW_CLUSTER_BY = 34;
// Enables support for column definition list in CREATE EXTERNAL TABLE.
// Example: CREATE EXTERNAL TABLE t (x FLOAT64)
FEATURE_CREATE_EXTERNAL_TABLE_WITH_TABLE_ELEMENT_LIST = 35;
// Enables using NOT ENFORCED in primary keys.
// See (broken link).
FEATURE_UNENFORCED_PRIMARY_KEYS = 40;
// BIGNUMERIC data type. (broken link)
FEATURE_BIGNUMERIC_TYPE = 41;
// Extended types (TYPE_EXTENDED): (broken link).
FEATURE_EXTENDED_TYPES = 42
[(language_feature_options).in_development = true];
// JSON data type. (broken link)
FEATURE_JSON_TYPE = 43 [(language_feature_options).in_development = true];
// Enables support for WITH PARTITION COLUMNS in CREATE EXTERNAL TABLE.
// Example:
// CREATE EXTERNAL TABLE t WITH PARTITION COLUMNS (x int64)
// More details: (broken link)
FEATURE_CREATE_EXTERNAL_TABLE_WITH_PARTITION_COLUMNS = 47
[(language_feature_options).in_development = true];
// INTERVAL data type. (broken link)
FEATURE_INTERVAL_TYPE = 49 [(language_feature_options).in_development = true];
// If enabled, JSON parsing fails for JSON documents containing number values
// that cannot fit into the range of numbers supported by uint64, int64 or
// double.
// For unsigned integers, the valid range is [0, 2^64-1]
// For signed integers, the valid range is [-2^63, 2^63-1].
// For floating point values, the valid range contains all numbers that can
// round-trip from string -> double -> string. The round-tripped string
// doesn't need to match the input string exactly, but must hold the same
// number value (i.e. "1e+3" -> double -> "1000" is a valid round-trip).
// If precision loss occurs as a result of the round-trip, the number is not
// considered valid (i.e. 0.142857142857142857142857142857142857 -> double ->
// 14285714285714285 is not valid).
FEATURE_JSON_STRICT_NUMBER_PARSING = 52
[(language_feature_options).ideally_enabled = false];
// When enabled, (table) function argument names will hide column names in
// expression resolution and relational table function argument names will
// hide table names from the catalog. This changes name resolution and is
// a backward compatibility breaking change.
FEATURE_FUNCTION_ARGUMENT_NAMES_HIDE_LOCAL_NAMES = 55;
// Enables support for the following parameterized types.
// - STRING(L) / BYTES(L)
// - NUMERIC(P) / NUMERIC(P, S)
// - BIGNUMERIC(P) / BIGNUMERIC(P, S)
// See (broken link) for details.
FEATURE_PARAMETERIZED_TYPES = 56;
// Enables support for CREATE TABLE LIKE
// Example:
// CREATE TABLE t1 LIKE t2
FEATURE_CREATE_TABLE_LIKE = 57;
// Enable support for JSON_EXTRACT_STRING_ARRAY, JSON_VALUE_ARRAY and
// JSON_QUERY_ARRAY. (broken link)
FEATURE_JSON_ARRAY_FUNCTIONS = 58;
// Enables explicit column list for CREATE VIEW.
// Example:
// CREATE VIEW v(a, b) AS SELECT ...
FEATURE_CREATE_VIEW_WITH_COLUMN_LIST = 59;
// Enables support for CREATE TABLE CLONE
// Example:
// CREATE TABLE t1 CLONE t2
FEATURE_CREATE_TABLE_CLONE = 60
[(language_feature_options).in_development = true];
// Enables support for CLONE DATA INTO
// Example: CLONE DATA INTO ds.tbl;
FEATURE_CLONE_DATA = 61 [(language_feature_options).in_development = true];
// Enables support for ALTER COLUMN SET DATA TYPE.
// See (broken link) for details.
FEATURE_ALTER_COLUMN_SET_DATA_TYPE = 62
[(language_feature_options).in_development = true];
// Enables support for CREATE SNAPSHOT TABLE
// (broken link)
FEATURE_CREATE_SNAPSHOT_TABLE = 63;
// Enables support for defining argument defaults in function calls using
// syntax like:
// CREATE FUNCTION foo (a INT64 DEFAULT 5) AS (a);
// In effect, the argument with a default becomes optional when the function
// is called, like:
// SELECT foo();
// For more information, please refer to (broken link).
FEATURE_FUNCTION_ARGUMENTS_WITH_DEFAULTS = 64;
// Enables support for WITH CONNECTION in CREATE EXTERNAL TABLE.
// Example:
// CREATE EXTERNAL TABLE t WITH CONNECTION `project.region.connection_1`
// More details: (broken link)
FEATURE_CREATE_EXTERNAL_TABLE_WITH_CONNECTION = 65;
// Enables support for CREATE TABLE COPY
// Example:
// CREATE TABLE t1 COPY t2
FEATURE_CREATE_TABLE_COPY = 66;
// Enables support for ALTER TABLE RENAME COLUMN.
// See (broken link) for details.
FEATURE_ALTER_TABLE_RENAME_COLUMN = 67;
// Enables STRING(JSON), INT64(JSON), BOOL(JSON), DOUBLE(JSON),
// JSON_TYPE(JSON) functions.
// See (broken link) for details.
FEATURE_JSON_VALUE_EXTRACTION_FUNCTIONS = 68
[(language_feature_options).in_development = true];
// Disallows "unicode", "unicode:ci", "unicode:cs" in ORDER BY ... COLLATE and
// other collation features. "unicode" is a legacy feature, and the desired
// behavior is to allow only "binary" and valid icu language tags.
// Enabling this feature must produce an error if 'unicode' is specified as
// a collation name.
FEATURE_DISALLOW_LEGACY_UNICODE_COLLATION = 69 [
(language_feature_options).in_development = true,
(language_feature_options).ideally_enabled = false
];
FEATURE_ALLOW_MISSING_PATH_EXPRESSION_IN_ALTER_DDL = 70;
// Enables TIMESTAMP_BUCKET, DATE_BUCKET and DATETIME_BUCKET functions.
// See (broken link) for details.
FEATURE_TIME_BUCKET_FUNCTIONS = 71
[(language_feature_options).in_development = true];
// Enables the new trigonometric math functions CSC, SEC, COT, CSCH, SECH,
// and COTH
// DEPRECATED
FEATURE_INVERSE_TRIG_FUNCTIONS = 72
[(language_feature_options).in_development = true];
// RANGE data type. (broken link)
FEATURE_RANGE_TYPE = 73 [(language_feature_options).in_development = true];
// Enable support for non SQL procedure.
FEATURE_NON_SQL_PROCEDURE = 75
[(language_feature_options).in_development = true];
FEATURE_ROUND_WITH_ROUNDING_MODE = 76
[(language_feature_options).in_development = true];
// Enables the CBRT function
FEATURE_CBRT_FUNCTIONS = 77
[(language_feature_options).in_development = true];
// Enable support for Spanner-specific DDL syntax.
// This is an extended syntax mode allowing compatibility with legacy
// Spanner DDL syntax and is meant to allow Cloud Spanner Emulator to use
// SQL for all processing needs.
// It is implemented only in the parser and analysis is disallowed in this
// mode, with resolver failing immediately.
// Spanner-specific syntax is not supported outside of this mode and will
// cause parsing errors.
FEATURE_SPANNER_LEGACY_DDL = 78 [(language_feature_options) = {
ideally_enabled: false,
in_development: true
}];
// This feature can be enabled to disable the new SQL functions ARRAY_MIN and
// ARRAY_MAX. It is here to ensure there is a way to turn these functions off
// in case they cause trouble.
FEATURE_DISABLE_ARRAY_MIN_AND_MAX = 79
[(language_feature_options) = { ideally_enabled: false }];
// When FEATURE_FUNCTION_ARGUMENTS_WITH_DEFAULTS is also enabled, apply a
// strict (and correct) type coercion from the given default argument value to
// the specified argument type.
// This feature is disabled by default, to avoid breaking existing production
// queries that rely on FEATURE_FUNCTION_ARGUMENTS_WITH_DEFAULTS.
FEATURE_STRICT_FUNCTION_DEFAULT_ARG_TYPE_COERCION = 80
[(language_feature_options) = { ideally_enabled: false }];
// -> Add more cross-version features here.
// -> DO NOT add more versioned features into versions that are frozen.
// New features should be added for the *next* version number.
// VERSIONED FEATURES
// These are features or changes as of some version.
// Each should start with a prefix FEATURE_V_x_y_. The feature will be
// included in the default set enabled for LanguageVersion VERSION_x_y.
//
// Features that will remain optional for compliance, and are not expected to
// be implemented in all engines, should be added as cross-version features
// (above) instead.
//
// Some versioned features may have dependencies and only make sense if
// other features are also enabled. Dependencies should be commented here.
// Version 1.1 features
// * Frozen in February 2017.
// * Do not add new features here.
// Enable ORDER BY COLLATE. See (broken link).
FEATURE_V_1_1_ORDER_BY_COLLATE = 11001;
// Enable WITH clause on subqueries. Without this, WITH is allowed
// only at the top level. The WITH subqueries still cannot be
// correlated subqueries.
FEATURE_V_1_1_WITH_ON_SUBQUERY = 11002;
// Enable the SELECT * EXCEPT and SELECT * REPLACE features.
// See (broken link).
FEATURE_V_1_1_SELECT_STAR_EXCEPT_REPLACE = 11003;
// Enable the ORDER BY in aggregate functions.
// See (broken link)
FEATURE_V_1_1_ORDER_BY_IN_AGGREGATE = 11004;
// Enable casting between different array types.
FEATURE_V_1_1_CAST_DIFFERENT_ARRAY_TYPES = 11005;
// Enable comparing array equality.
FEATURE_V_1_1_ARRAY_EQUALITY = 11006;
// Enable LIMIT in aggregate functions.
FEATURE_V_1_1_LIMIT_IN_AGGREGATE = 11007;
// Enable HAVING modifier in aggregate functions.
FEATURE_V_1_1_HAVING_IN_AGGREGATE = 11008;
// Enable IGNORE/RESPECT NULLS modifier in analytic functions.
FEATURE_V_1_1_NULL_HANDLING_MODIFIER_IN_ANALYTIC = 11009;
// Enable IGNORE/RESPECT NULLS modifier in aggregate functions.
FEATURE_V_1_1_NULL_HANDLING_MODIFIER_IN_AGGREGATE = 11010;
// Enable FOR SYSTEM_TIME AS OF (time travel).
// See (broken link).
FEATURE_V_1_1_FOR_SYSTEM_TIME_AS_OF = 11011;
// Version 1.2 features
// * Frozen in January 2018.
// * Do not add new features here.
// Enable TIME and DATETIME types and related functions.
FEATURE_V_1_2_CIVIL_TIME = 12001;
// Enable SAFE mode function calls. e.g. SAFE.FUNC(...) for FUNC(...).
// (broken link).
FEATURE_V_1_2_SAFE_FUNCTION_CALL = 12002;
// Enable support for GROUP BY STRUCT.
FEATURE_V_1_2_GROUP_BY_STRUCT = 12003;
// Enable use of proto extensions with NEW.
FEATURE_V_1_2_PROTO_EXTENSIONS_WITH_NEW = 12004;
// Enable support for GROUP BY ARRAY.
FEATURE_V_1_2_GROUP_BY_ARRAY = 12005;
// Enable use of proto extensions with UPDATE ... SET.
FEATURE_V_1_2_PROTO_EXTENSIONS_WITH_SET = 12006;
// Allows nested DML statements to refer to names defined in the parent
// scopes. Without this, a nested DML statement can only refer to names
// created in the local statement - i.e. the array element.
// Examples that are allowed only with this option:
// UPDATE Table t SET (UPDATE t.ArrayColumn elem SET elem = t.OtherColumn)
// UPDATE Table t SET (DELETE t.ArrayColumn elem WHERE elem = t.OtherColumn)
// UPDATE Table t SET (INSERT t.ArrayColumn VALUES (t.OtherColumn))
// UPDATE Table t SET (INSERT t.ArrayColumn SELECT t.OtherColumn)
FEATURE_V_1_2_CORRELATED_REFS_IN_NESTED_DML = 12007;
// Enable use of WEEK(<Weekday>) with the functions that support it.
FEATURE_V_1_2_WEEK_WITH_WEEKDAY = 12008;
// Enable use of array element [] syntax in targets with UPDATE ... SET.
// For example, allow UPDATE T SET a.b[OFFSET(0)].c = 5.
FEATURE_V_1_2_ARRAY_ELEMENTS_WITH_SET = 12009;
// Enable nested updates/deletes of the form
// UPDATE/DELETE ... WITH OFFSET AS ... .
FEATURE_V_1_2_NESTED_UPDATE_DELETE_WITH_OFFSET = 12010;
// Enable Generated Columns on CREATE and ALTER TABLE statements.
// See (broken link).
FEATURE_V_1_2_GENERATED_COLUMNS = 12011;
// Version 1.3 features
// Enables support for the PROTO_DEFAULT_IF_NULL() function, see
// (broken link)
FEATURE_V_1_3_PROTO_DEFAULT_IF_NULL = 13001;
// Enables support for proto field pseudo-accessors in the EXTRACT function.
// For example, EXTRACT(FIELD(x) from foo) will extract the value of the field
// x defined in message foo. EXTRACT(HAS(x) from foo) will return a boolean
// denoting if x is set in foo or NULL if foo is NULL. EXTRACT(RAW(x) from
// foo) will get the value of x on the wire (i.e., without applying any
// FieldFormat.Format annotations or automatic conversions). If the field is
// missing, the default is always returned, which is NULL for message fields
// and the field default (either the explicit default or the default default)
// for primitive fields. If the containing message is NULL, NULL is returned.
// (broken link)
FEATURE_V_1_3_EXTRACT_FROM_PROTO = 13002;
// If enabled, the analyzer will return an error when attempting to check
// if a proto3 scalar field has been explicitly set (e.g.,
// proto3.has_scalar_field and EXTRACT(HAS(scalar_field) from proto3)).
// This feature is deprecated and should not be used, since proto3 now
// supports scalar field presence testing. Eventually we will remove this
// feature and the underlying code.
FEATURE_V_1_3_DEPRECATED_DISALLOW_PROTO3_HAS_SCALAR_FIELD = 13003
[(language_feature_options).ideally_enabled = false];
// Enable array ordering (and non-equality comparisons). This enables
// arrays in the ORDER BY of a query, as well as in aggregate and analytic
// function arguments. Also enables inequality comparisons between arrays
// (<, <=, >, >=). This flag enables arrays for MIN/MAX,
// although semantics over array inputs are surprising sometimes.
//
// Note: there is a separate flag for GREATEST/LEAST, as not all engines are
// ready to implement them for arrays.
// Spec: (broken link)
FEATURE_V_1_3_ARRAY_ORDERING = 13004;
// Allow omitting column and value lists in INSERT statement and INSERT clause
// of MERGE statement.
// Spec: (broken link)
FEATURE_V_1_3_OMIT_INSERT_COLUMN_LIST = 13005;
// If enabled, the 'use_defaults' and 'use_field_defaults' annotations are
// ignored for proto3 scalar fields. This results in the default value always
// being returned for proto3 scalar fields that are not explicitly set,
// including when they are annotated with 'use_defaults=false' or their parent
// message is annotated with 'use_field_defaults=false'. This aligns with
// proto3 semantics as proto3 does not expose whether scalar fields are set or
// not.
FEATURE_V_1_3_IGNORE_PROTO3_USE_DEFAULTS = 13006;
// Enables support for the REPLACE_FIELDS() function. REPLACE_FIELDS(p,
// <value> AS <field_path>) returns the proto obtained by setting p.field_path
// = value. If value is NULL, this unsets field_path or returns an error if
// the last component of field_path is a required field. Multiple fields can
// be modified: REPLACE_FIELDS(p, <value_1> AS <field_path_1>, ..., <value_n>
// AS <field_path_n>). REPLACE_FIELDS() can also be used to modify structs
// using the similar syntax: REPLACE_FIELDS(s, <value> AS
// <struct_field_path>).
// (broken link)
FEATURE_V_1_3_REPLACE_FIELDS = 13007;
// Enable NULLS FIRST/NULLS LAST in ORDER BY expressions.
FEATURE_V_1_3_NULLS_FIRST_LAST_IN_ORDER_BY = 13008;
// Allows dashes in the first part of multi-part table name. This is to
// accommodate GCP project names which use dashes instead of underscores, e.g.
// crafty-tractor-287. So fully qualified table name which includes project
// name normally has to be quoted in the query, i.e. SELECT * FROM
// `crafty-tractor-287`.dataset.table This feature allows it to be used
// unquoted, i.e. SELECT * FROM crafty-tractor-287.dataset.table
FEATURE_V_1_3_ALLOW_DASHES_IN_TABLE_NAME = 13009;
// CONCAT allows arguments of different types, automatically coerced to
// STRING for FN_CONCAT_STRING signature. Only types which have CAST to
// STRING defined are allowed, and BYTES is explicitly excluded (since BYTES
// should match FN_CONCAT_BYTES signature).
FEATURE_V_1_3_CONCAT_MIXED_TYPES = 13010;
// Enable WITH RECURSIVE ((broken link))
FEATURE_V_1_3_WITH_RECURSIVE = 13011;
// Support maps in protocol buffers. ((broken link))
FEATURE_V_1_3_PROTO_MAPS = 13012;
// Enables support for the ENUM_VALUE_DESCRIPTOR_PROTO() function, see
// (broken link)
FEATURE_V_1_3_ENUM_VALUE_DESCRIPTOR_PROTO = 13013;
// Allows DECIMAL as an alias of NUMERIC type, and BIGDECIMAL as an alias
// of BIGNUMERIC type. By itself, this feature does not enable NUMERIC type
// or BIGNUMERIC, which are controlled by FEATURE_NUMERIC_TYPE and
// FEATURE_BIGNUMERIC_TYPE.
FEATURE_V_1_3_DECIMAL_ALIAS = 13014;
// Support UNNEST and FLATTEN on paths through arrays.
// ((broken link))
FEATURE_V_1_3_UNNEST_AND_FLATTEN_ARRAYS = 13015;
// Allows consecutive ON/USING clauses for JOINs, such as
// t1 JOIN t2 JOIN t3 ON cond1 USING (col2)
FEATURE_V_1_3_ALLOW_CONSECUTIVE_ON = 13016;
// Enables support for optional parameters position and occurrence in
// REGEXP_EXTRACT. In addition, allows alias REGEXP_SUBSTR.
// ((broken link))
FEATURE_V_1_3_ALLOW_REGEXP_EXTRACT_OPTIONALS = 13017;
// Additional signatures for DATE, TIMESTAMP, TIME, DATETIME and STRING
// constructor functions.
FEATURE_V_1_3_DATE_TIME_CONSTRUCTORS = 13018;
// Enables DATE +/- INT64 arithmetics.
// ((broken link))
FEATURE_V_1_3_DATE_ARITHMETICS = 13019;
// Enable support for additional string functions.
FEATURE_V_1_3_ADDITIONAL_STRING_FUNCTIONS = 13020;
// Enable support for aggregate functions with WITH GROUP_ROWS syntax.
FEATURE_V_1_3_WITH_GROUP_ROWS = 13021;
// Additional signatures for [DATE|DATETIME|TIMESTAMP]_[ADD|SUB|DIFF|TRUNC]
// functions. ((broken link)).
FEATURE_V_1_3_EXTENDED_DATE_TIME_SIGNATURES = 13022;
// Additional signatures for ST_GeogFromText/FromGeoJson/From* functions.
// ((broken link)).
FEATURE_V_1_3_EXTENDED_GEOGRAPHY_PARSERS = 13023;
// Inline lambda function argument. (broken link)
FEATURE_V_1_3_INLINE_LAMBDA_ARGUMENT = 13024;
// PIVOT clause ((broken link)).
FEATURE_V_1_3_PIVOT = 13025;
// This flag enables propagation of annotation during query analysis. See
// public/types/annotation.h for the introduction of annotation framework.
// Engines must turn on this flag before turning on any built-in annotation
// feature or passing in engine defined AnnotationSpec.
FEATURE_V_1_3_ANNOTATION_FRAMEWORK = 13026;
// Enables collation annotation support.
FEATURE_V_1_3_COLLATION_SUPPORT = 13027
[(language_feature_options).in_development = true];
// IS [NOT] DISTINCT FROM ((broken link)).
FEATURE_V_1_3_IS_DISTINCT = 13028;
// If true, FORMAT clause is supported in CAST().
// Fully implemented:
// BYTES <=> STRING
// DATE/DATETIME/TIME/TIMESTAMP => STRING
//
// Under development:
// STRING => DATE/DATETIME/TIME/TIMESTAMP
// NUMBER => STRING
FEATURE_V_1_3_FORMAT_IN_CAST = 13029;
// UNPIVOT clause ((broken link)).
FEATURE_V_1_3_UNPIVOT = 13030;
// If true, dml returning is supported ((broken link))
FEATURE_V_1_3_DML_RETURNING = 13031;
// Enables support for the FILTER_FIELDS() function.
// FILTER_FIELDS(p, <-|+><field_path>, ...)
// returns the proto obtained by keeping p.field_path whose
// sign is '+' and remove p.field_path whose sign is '-'.
// (broken link)
FEATURE_V_1_3_FILTER_FIELDS = 13032;
// QUALIFY clause ((broken link)).
FEATURE_V_1_3_QUALIFY = 13033;
// Enable support for REPEAT...UNTIL...END REPEAT statement.
// (broken link)
FEATURE_V_1_3_REPEAT = 13034;
// Enables column DEFAULT clause in CREATE and ALTER TABLE statements.
// See (broken link)
FEATURE_V_1_3_COLUMN_DEFAULT_VALUE = 13035;
// Enable support for FOR...IN...DO...END FOR statement. // NOTYPO
// (broken link)
FEATURE_V_1_3_FOR_IN = 13036;
// Enables support for initializing KLLs with weights as an additional
// parameter. Support for this feature in addition to the weighting
// functionality also requires support for named arguments as the weight
// argument must be named. (broken link).
FEATURE_V_1_3_KLL_WEIGHTS = 13037;
// LIKE ANY/SOME/ALL support.
// (broken link)
FEATURE_V_1_3_LIKE_ANY_SOME_ALL = 13038
[(language_feature_options).in_development = true];
// Enable support for CASE...WHEN...THEN...END CASE statement.
// (broken link)
FEATURE_V_1_3_CASE_STMT = 13039;
// Support for table names that start with slash and contain slashes, dashes,
// and colons before the first dot: /span/test/my-grp:db.Table.
// (broken link)
FEATURE_V_1_3_ALLOW_SLASH_PATHS = 13040;
// Enable the TYPEOF(expr) debugging and exploration function.
FEATURE_V_1_3_TYPEOF_FUNCTION = 13041;
// Enable support for SCRIPT LABELS (e.g. L1: BEGIN...END)
// (broken link)
FEATURE_V_1_3_SCRIPT_LABEL = 13042;
// Enable support for remote function (e.g. CREATE FUNCTION ... REMOTE ...)
// (broken link)
FEATURE_V_1_3_REMOTE_FUNCTION = 13043;
// If Array ordering is enabled, this flag enables arrays for GREATEST/LEAST.
FEATURE_V_1_3_ARRAY_GREATEST_LEAST = 13044;
// Enables braced constructors for protocol buffers.
// See (broken link)
FEATURE_V_1_3_BRACED_PROTO_CONSTRUCTORS = 13045;
// Version 1.4 features
// -> Add more versioned features here.
// -> Update AnalyzerOptions::GetLanguageFeaturesForVersion in
// language_options.cc when the new feature is passed "in_development"
// stage.
// Allow WITH-expressions. See (broken link).
FEATURE_V_1_4_WITH_EXPRESSION = 14000;
// Allow ordered elements in primary key definition.
// See (broken link).
FEATURE_V_1_4_ORDERED_PRIMARY_KEYS = 14002
[(language_feature_options).in_development = true];
// Allow TTL clauses (ROW DELETION POLICY). See (broken link).
FEATURE_V_1_4_TTL = 14003 [(language_feature_options).in_development = true];
// Allow bare array access like a[0]. See (broken link)
FEATURE_V_1_4_BARE_ARRAY_ACCESS = 14004;
// Enable builtin functions ARRAY_MIN, ARRAY_MAX, ARRAY_SUM and ARRAY_AVG.
FEATURE_V_1_4_ARRAY_AGGREGATION_FUNCTIONS = 14005
[(language_feature_options).in_development = true];
// Using string type argument as a placeholder for enum type argument.
// Related functions include ARRAY_OFFSET(S), ARRAY_FIND, and ARRAY_FIND_ALL.
// This language feature guard is added temporarily to unblock related
// functions development from enum development. This feature will be removed.
FEATURE_V_1_4_STRING_AS_ENUM_ARGUMENT = 14006
[(language_feature_options).in_development = true];
// Enable SAFE mode for function calls with lambda arguments,
// e.g. SAFE.ARRAY_TRANSFORM(array_input, e -> 1 /e )
// (broken link).
FEATURE_V_1_4_SAFE_FUNCTION_CALL_WITH_LAMBDA_ARGS = 14007;
// Enable support for remote models (e.g. CREATE MODEL ... REMOTE ...)
// (broken link)
FEATURE_V_1_4_REMOTE_MODEL = 14009
[(language_feature_options).in_development = true];
// Allow struct field access like s[OFFSET(0)].
// See (broken link)
FEATURE_V_1_4_STRUCT_POSITIONAL_ACCESSOR = 14010;
// EXPERIMENTAL FEATURES
// These are features supported in the code that are not currently part of
// officially supported SQL as of any version.
//
// An example:
// FEATURE_EXPERIMENTAL_DECIMAL_DATA_TYPES = 999001;
//
// -> Add more experimental features here.
// Enable SQL MODULES. For an engine to fully opt into this feature,
// they must enable this feature flag and add support for the related
// StatementKinds: RESOLVED_IMPORT_STMT and RESOLVED_MODULE_STMT.
// See (broken link)
FEATURE_EXPERIMENTAL_MODULES = 999002
[(language_feature_options).in_development = true];
// These are not real features. They are just for unit testing the handling of
// various LanguageFeatureOptions.
FEATURE_TEST_IDEALLY_ENABLED_BUT_IN_DEVELOPMENT = 999991
[(language_feature_options).in_development = true];
FEATURE_TEST_IDEALLY_DISABLED = 999992
[(language_feature_options).ideally_enabled = false];
FEATURE_TEST_IDEALLY_DISABLED_AND_IN_DEVELOPMENT = 999993
[(language_feature_options) = {
ideally_enabled: false,
in_development: true
}];
// User code that switches on this enum must have a default case so
// builds won't break if new enums get added.
__LanguageFeature__switch_must_have_a_default__ = -1;
}
message ResolvedASTRewriteOptions {
// Whether the rewrite is enabled by default or not.
optional bool default_enabled = 1;
// Indicates whether a rewrite is still undergoing development. Users should
// not enable rewrites that are still in development for production code,
// and should check with SQL-team@ before using in experimental code.
optional bool in_development = 2 [default = false];
}
// Supported SQL resolved AST rewrites.
//
// We support these rewrites to allow syntactic improvements which generate new
// node types to be quickly and easily available to engines without needing each
// engine to implement support for the new node types.
enum ResolvedASTRewrite {
// Make sure default value of 0 is not an resolved AST rewrite.
REWRITE_INVALID_DO_NOT_USE = 0;
// Rewrites ResolvedFlatten nodes into equivalent array scans / subqueries.
REWRITE_FLATTEN = 1 [(rewrite_options).default_enabled = true];
// Supports rewriting ResolvedAnonymizedAggregateScan and related.
// See (broken link).
REWRITE_ANONYMIZATION = 2 [(rewrite_options).default_enabled = false];
// Rewrites proto map functions (e.g. map[KEY(key)]) with equivalent
// unnest/subquery expressions. This rewrite will only occur when such
// functions are present in a resolved AST, which requires the
// V_1_3_PROTO_MAPS language feature.
REWRITE_PROTO_MAP_FNS = 3 [(rewrite_options).default_enabled = true];
// Rewrites array function calls into equivalent SubqueryExpr.
REWRITE_ARRAY_FILTER_TRANSFORM = 4 [(rewrite_options).default_enabled = true];
// Rewrites unpivot ast to equivalent scan.
REWRITE_UNPIVOT = 5 [(rewrite_options).default_enabled = true];
// Rewrites PIVOT scans. See (broken link).
REWRITE_PIVOT = 6 [(rewrite_options).default_enabled = true];
// Rewrites ARRAY_INCLUDES function calls into equivalent SubqueryExpr.
REWRITE_ARRAY_INCLUDES = 7 [(rewrite_options).default_enabled = true];
// Rewrite typeof function. See (broken link)
REWRITE_TYPEOF_FUNCTION = 8 [(rewrite_options).default_enabled = true];
// Rewrite WithExpr into subquery.
REWRITE_WITH_EXPR = 9 [(rewrite_options).default_enabled = true];
// Inline SQL Functions.
// Experimental, functionality may change before generally available.
// Functions that are added to the Catalog that are subtypes of
// SQLFunctionBase will be inlined. That removes the ResolvedFunctionCall and
// replaces it with an expression that evaluates the function body.
// Currently, not all shapes of functions are supported:
// * Argument references inside WITH subqueries will result in an
// kUnimplemented error.
REWRITE_INLINE_SQL_FUNCTIONS = 10 [
(rewrite_options).default_enabled = false,
(rewrite_options).in_development = true
];
// Inline SQL TVFs (Table Valued Functions).
// Experimental, functionality may change before generally available.
// Functions that are added to the Catalog that are subtypes of
// SQLFunctionBase will be inlined. That removes the ResolvedFunctionCall and
// replaces it with an expression that evaluates the function body.
// Currently, not all shapes of functions and function calls are supported:
// * Argument references inside WITH subqueries will result in an
// kUnimplemented error.
// * Correlated subqueries cannot be used as arguments to TABLE parameters.
REWRITE_INLINE_SQL_TVFS = 11 [
(rewrite_options).default_enabled = false,
(rewrite_options).in_development = true
];
// Rewrite NULLIFERROR(expr) into IFERROR(expr, NULL)
// See (broken link)
REWRITE_NULLIFERROR_FUNCTION = 12 [(rewrite_options).default_enabled = true];
// Rewrite unary functions into subqueries.
// The functions that use unary rewriter have single input.
REWRITE_UNARY_FUNCTIONS = 13 [(rewrite_options).default_enabled = true];
// Rewrite LIKE ANY/SOME/ALL functions with pattern lists represented as
// (pattern1, ...), UNNEST(<array-expression>), or a subquery
// See (broken link)
REWRITE_LIKE_ANY_ALL = 14 [(rewrite_options).default_enabled = true];
// Rewrite ternary functions into subqueries.
// The functions that use ternary rewriter have three inputs.
REWRITE_TERNARY_FUNCTIONS = 15 [(rewrite_options).default_enabled = true];
// Rewrite binary functions into subqueries.
// The functions that use binary rewriter have two inputs.
REWRITE_BINARY_FUNCTIONS = 16 [(rewrite_options).default_enabled = true];
// Inline SQL Views.
// Experimental. Functionality may change before generally available.
// Views that are added to the Catalog that are subtypes of
// SQLView will be inlined if SQLView::enable_view_inline returns true.
// That removes the ResolvedTableScan and replaces it with an expression that
// evaluates the view body, much as if the view was written inline.
REWRITE_INLINE_SQL_VIEWS = 17 [
(rewrite_options).default_enabled = true,
(rewrite_options).in_development = true
];
}
// This can be used to select strict name resolution mode.
//
// In strict mode, implicit column names cannot be used unqualified.
// This ensures that existing queries will not be broken if additional
// elements are added to the schema in the future.
//
// For example,
// SELECT c1, c2 FROM table1, table2;
// is not legal in strict mode because another column could be added to one of
// these tables, making the query ambiguous. The query must be written
// with aliases in strict mode:
// SELECT t1.c1, t2.c2 FROM table1 t1, table t2;
//
// SELECT * is also not allowed in strict mode because the number of output
// columns may change.
//
// See (broken link) for full details.
enum NameResolutionMode {
NAME_RESOLUTION_DEFAULT = 0;
NAME_RESOLUTION_STRICT = 1;
}
// This identifies whether SQL works in INTERNAL (inside Google) mode,
// or in EXTERNAL (exposed to non-Googlers in the products such as Cloud).
// See (broken link) for details.
enum ProductMode {
PRODUCT_INTERNAL = 0;
PRODUCT_EXTERNAL = 1;
}
// This identifies whether statements are resolved in module context (i.e.,
// as a statement contained in a module), or in normal/default context
// (outside of a module).
// See (broken link) for details about module context.
enum StatementContext {
CONTEXT_DEFAULT = 0;
CONTEXT_MODULE = 1;
}
// Mode describing how errors should be constructed in the returned
// absl::Status.
enum ErrorMessageMode {
// The error string does not contain a location.
// An ErrorLocation proto will be attached to the absl::Status with
// a location, when applicable.
// See error_helpers.h for working with these payloads.
// See error_location.proto for how line and column are defined.
ERROR_MESSAGE_WITH_PAYLOAD = 0;
// The error string contains a suffix " [at <line>:<column>]" when an
// error location is available.
ERROR_MESSAGE_ONE_LINE = 1;
// The error string matches ERROR_MESSAGE_ONE_LINE, and also contains
// a second line with a substring of the input query, and a third line
// with a caret ("^") pointing at the error location above.
ERROR_MESSAGE_MULTI_LINE_WITH_CARET = 2;
}
// Mode describing how parameters are defined and referenced.
enum ParameterMode {
// Parameters are defined by name (the default) and referenced using the
// syntax @param_name.
PARAMETER_NAMED = 0;
// Parameters are defined positionally and referenced with ?. For example, if
// two parameters are bound, the first occurrence of ? in the query string
// refers to the first parameter and the second occurrence to the second
// parameter.
PARAMETER_POSITIONAL = 1;
// No parameters are allowed in the query.
PARAMETER_NONE = 2;
}
// The option controlling what kind of parse location is recorded in a resolved
// AST node.
enum ParseLocationRecordType {
// Parse locations are not recorded.
PARSE_LOCATION_RECORD_NONE = 0;
// Parse locations cover the entire range of the related node, e.g., the full
// function call text associated with a ResolvedFunctionCall, or the full
// expression text associated with a ResolvedCast.
PARSE_LOCATION_RECORD_FULL_NODE_SCOPE = 1;
// Parse locations of nodes cover a related object name in the text, as
// convenient for code search, e.g., just the function name associated with a
// ResolvedFunctionCall, or the target Type text associated with a
// ResolvedCast.
PARSE_LOCATION_RECORD_CODE_SEARCH = 2;
}