Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
0d781bf
[CONNECT][SDP][SPARK-56249] Create AUTO CDC syntax for SCD Type 1 in SQL
anew Jun 10, 2026
5939533
[CONNECT][SDP][SPARK-56249] Fix lines exceeding 100 char limit in Aut…
anew Jun 10, 2026
22ec1ce
[CONNECT][SDP][SPARK-56249] Add AUTO CDC keywords to ansiNonReserved …
anew Jun 10, 2026
f98202f
[CONNECT][SDP][SPARK-56249] Update keyword golden files and hardcoded…
anew Jun 10, 2026
efeaa9b
trigger CI
anew Jun 10, 2026
9b63992
[CONNECT][SDP][SPARK-56249] Remove unintended CREATE OR REFRESH synta…
anew Jun 10, 2026
61fefea
[CONNECT][SDP][SPARK-56249] Address review feedback for AUTO CDC SQL …
anew Jun 12, 2026
e7ad493
[CONNECT][SDP][SPARK-56249] Enforce fixed clause order for AUTO CDC s…
anew Jun 12, 2026
ebda4cb
[CONNECT][SDP][SPARK-56249] Merge createStreamingTableAutoCdc into cr…
anew Jun 13, 2026
9590ebb
[CONNECT][SDP][SPARK-56249] Use checkError in AutoCdcParserSuite erro…
anew Jun 13, 2026
1f8df74
[SPARK-57402][SQL] Restrict AUTO CDC source to STREAM(...) and KEYS/C…
anew Jun 26, 2026
9f09360
[SPARK-57402][SQL] Remove MISSING_CLAUSES_FOR_OPERATION error condition
anew Jun 26, 2026
faa35c7
[SPARK-57402][SQL] Rename AUTO CDC column params and make them optional
anew Jun 26, 2026
0b0dba5
[SPARK-57402][SQL] Expose AUTO CDC source relation as a plan child
anew Jun 26, 2026
0ddd1f1
[SPARK-57402][SQL] Rename applyChanges local to autoCdcInto in visitC…
anew Jun 26, 2026
eb2f9d4
[SPARK-57402][SQL] Use named parameters when constructing AUTO CDC ca…
anew Jun 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions docs/sql-ref-ansi-compliance.md
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,7 @@ Below is a list of all the keywords in Spark SQL.
|ANTI|non-reserved|strict-non-reserved|non-reserved|
|ANY|reserved|non-reserved|reserved|
|ANY_VALUE|non-reserved|non-reserved|non-reserved|
|APPLY|non-reserved|non-reserved|non-reserved|
|APPROX|non-reserved|non-reserved|non-reserved|
|ARCHIVE|non-reserved|non-reserved|non-reserved|
|ARRAY|non-reserved|non-reserved|reserved|
Expand All @@ -432,6 +433,7 @@ Below is a list of all the keywords in Spark SQL.
|AT|non-reserved|non-reserved|reserved|
|ATOMIC|non-reserved|non-reserved|non-reserved|
|AUTHORIZATION|reserved|non-reserved|reserved|
|AUTO|non-reserved|non-reserved|non-reserved|
|BEGIN|non-reserved|non-reserved|non-reserved|
|BERNOULLI|non-reserved|non-reserved|non-reserved|
|BETWEEN|non-reserved|non-reserved|reserved|
Expand All @@ -456,6 +458,7 @@ Below is a list of all the keywords in Spark SQL.
|CAST|reserved|non-reserved|reserved|
|CATALOG|non-reserved|non-reserved|non-reserved|
|CATALOGS|non-reserved|non-reserved|non-reserved|
|CDC|non-reserved|non-reserved|non-reserved|
|CHANGE|non-reserved|non-reserved|non-reserved|
|CHANGES|non-reserved|non-reserved|non-reserved|
|CHAR|non-reserved|non-reserved|reserved|
Expand Down Expand Up @@ -744,6 +747,7 @@ Below is a list of all the keywords in Spark SQL.
|SELECT|reserved|non-reserved|reserved|
|SEMI|non-reserved|strict-non-reserved|non-reserved|
|SEPARATED|non-reserved|non-reserved|non-reserved|
|SEQUENCE|non-reserved|non-reserved|non-reserved|
|SERDE|non-reserved|non-reserved|non-reserved|
|SERDEPROPERTIES|non-reserved|non-reserved|non-reserved|
|SESSION_USER|reserved|non-reserved|reserved|
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ AND: 'AND';
ANTI: 'ANTI';
ANY: 'ANY';
ANY_VALUE: 'ANY_VALUE';
APPLY: 'APPLY';
APPROX: 'APPROX';
ARCHIVE: 'ARCHIVE';
ARRAY: 'ARRAY' {incComplexTypeLevelCounter();};
Expand All @@ -149,6 +150,7 @@ ASENSITIVE: 'ASENSITIVE';
AT: 'AT';
ATOMIC: 'ATOMIC';
AUTHORIZATION: 'AUTHORIZATION';
AUTO: 'AUTO';
BEGIN: 'BEGIN';
BERNOULLI: 'BERNOULLI';
BETWEEN: 'BETWEEN';
Expand All @@ -173,6 +175,7 @@ CASE: 'CASE';
CAST: 'CAST';
CATALOG: 'CATALOG';
CATALOGS: 'CATALOGS';
CDC: 'CDC';
CHANGE: 'CHANGE';
CHANGES: 'CHANGES';
CHAR: 'CHAR';
Expand Down Expand Up @@ -459,6 +462,7 @@ SECURITY: 'SECURITY';
SELECT: 'SELECT';
SEMI: 'SEMI';
SEPARATED: 'SEPARATED';
SEQUENCE: 'SEQUENCE';
SERDE: 'SERDE';
SERDEPROPERTIES: 'SERDEPROPERTIES';
SESSION_USER: 'SESSION_USER';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -416,8 +416,9 @@ statement
| unsupportedHiveNativeCommands .*? #failNativeCommand
| createPipelineDatasetHeader (LEFT_PAREN tableElementList? RIGHT_PAREN)? tableProvider?
createTableClauses
(AS query)? #createPipelineDataset
(AS query | FLOW autoCdcBody)? #createPipelineDataset
| createPipelineFlowHeader insertInto query #createPipelineInsertIntoFlow
| createPipelineFlowHeader autoCdcCommand #createFlowAutoCdc
;

materializedView
Expand Down Expand Up @@ -750,6 +751,41 @@ dmlStatementNoWith
notMatchedBySourceClause* #mergeIntoTable
;

autoCdcCommand
: AUTO CDC INTO target=multipartIdentifier
autoCdcParameters
;

autoCdcBody
: AUTO CDC autoCdcParameters
;

autoCdcParameters
: FROM source=autoCdcSource
KEYS LEFT_PAREN keys=identifierSeq RIGHT_PAREN
autoCdcDeleteClause?
autoCdcSequenceByClause
autoCdcColumnsClause?
;

autoCdcSource
: STREAM LEFT_PAREN multipartIdentifier RIGHT_PAREN
;

autoCdcDeleteClause
: APPLY AS DELETE WHEN deleteCondition=booleanExpression
;

autoCdcSequenceByClause
: SEQUENCE BY sequence=expression
;

autoCdcColumnsClause
: COLUMNS (
columns=identifierSeq |
ASTERISK EXCEPT LEFT_PAREN exceptCols=identifierSeq RIGHT_PAREN)
;

identifierReference
: IDENTIFIER_KW LEFT_PAREN expression RIGHT_PAREN
| multipartIdentifier
Expand Down Expand Up @@ -1959,13 +1995,15 @@ ansiNonReserved
| ANALYZE
| ANTI
| ANY_VALUE
| APPLY
| APPROX
| ARCHIVE
| ARRAY
| ASC
| ASENSITIVE
| AT
| ATOMIC
| AUTO
| BEGIN
| BERNOULLI
| BETWEEN
Expand All @@ -1987,6 +2025,7 @@ ansiNonReserved
| CASCADE
| CATALOG
| CATALOGS
| CDC
| CHANGE
| CHANGES
| CHAR
Expand Down Expand Up @@ -2218,6 +2257,7 @@ ansiNonReserved
| SECURITY
| SEMI
| SEPARATED
| SEQUENCE
| SERDE
| SERDEPROPERTIES
| SET
Expand Down Expand Up @@ -2346,6 +2386,7 @@ nonReserved
| AND
| ANY
| ANY_VALUE
| APPLY
| APPROX
| ARCHIVE
| ARRAY
Expand All @@ -2355,6 +2396,7 @@ nonReserved
| AT
| ATOMIC
| AUTHORIZATION
| AUTO
| BEGIN
| BERNOULLI
| BETWEEN
Expand All @@ -2380,6 +2422,7 @@ nonReserved
| CAST
| CATALOG
| CATALOGS
| CDC
| CHANGE
| CHANGES
| CHAR
Expand Down Expand Up @@ -2655,6 +2698,7 @@ nonReserved
| SECURITY
| SELECT
| SEPARATED
| SEQUENCE
| SERDE
| SERDEPROPERTIES
| SESSION_USER
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1362,6 +1362,58 @@ class AstBuilder extends DataTypeAstBuilder
withSchemaEvolution)
}

protected def buildAutoCdcIntoCommand(ctx: AutoCdcCommandContext): AutoCdcIntoCommand =
withOrigin(ctx) {
val target = visitMultipartIdentifier(ctx.target).asTableIdentifier
val params = parseAutoCdcParams(ctx.autoCdcParameters())
AutoCdcIntoCommand(
targetTable = target,
source = params.source,
keys = params.keys,
deleteCondition = params.deleteCondition,
sequenceByExpr = params.sequencing,
includeColumns = params.includeColumns,
excludeColumns = params.excludeColumns)
}

protected def parseAutoCdcParams(params: AutoCdcParametersContext): AutoCdcParams =
withOrigin(params) {
val source = resolveAutoCdcSource(params.source)
val keys = visitIdentifierSeq(params.keys).map(UnresolvedAttribute.quoted)
val deleteCondition = Option(params.autoCdcDeleteClause())
.map(c => expression(c.deleteCondition))
val sequencing = expression(params.autoCdcSequenceByClause().sequence)

val columnsClause = Option(params.autoCdcColumnsClause())
val includeColumns = columnsClause.collect {
case c if c.columns != null =>
visitIdentifierSeq(c.columns).map(UnresolvedAttribute.quoted)
}
val excludeColumns = columnsClause.collect {
case c if c.exceptCols != null =>
visitIdentifierSeq(c.exceptCols).map(UnresolvedAttribute.quoted)
}

AutoCdcParams(
source = source,
keys = keys,
deleteCondition = deleteCondition,
sequencing = sequencing,
includeColumns = includeColumns,
excludeColumns = excludeColumns)
}

/**
* Resolve the AUTO CDC source, which is a STREAM(multipartIdentifier). It is returned as an
* [[UnresolvedRelation]] marked as a streaming read via the `isStreaming` flag.
*/
protected def resolveAutoCdcSource(ctx: AutoCdcSourceContext): UnresolvedRelation =
withOrigin(ctx) {
val ident = visitMultipartIdentifier(ctx.multipartIdentifier)
createUnresolvedRelation(
ctx, ident, optionsClause = None, writePrivileges = Set.empty, isStreaming = true)
}

/**
* Returns the parameters for [[UnresolvedExecuteImmediate]] logical plan.
* Expected format:
Expand Down Expand Up @@ -7710,3 +7762,14 @@ class AstBuilder extends DataTypeAstBuilder
}
}
}

/**
* Parameters parsed from an AUTO CDC clause.
*/
case class AutoCdcParams(
source: LogicalPlan,
keys: Seq[UnresolvedAttribute],
deleteCondition: Option[Expression],
sequencing: Expression,
includeColumns: Option[Seq[UnresolvedAttribute]],
excludeColumns: Option[Seq[UnresolvedAttribute]])
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/*
* 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 org.apache.spark.sql.catalyst.plans.logical

import org.apache.spark.sql.catalyst.TableIdentifier
import org.apache.spark.sql.catalyst.analysis.UnresolvedAttribute
import org.apache.spark.sql.catalyst.expressions.Expression

/**
* Logical plan node for an AUTO CDC INTO command, used by Spark Declarative Pipelines.
*
* This represents a CDC (Change Data Capture) operation that applies an ordered change event
* stream from [[source]] into [[targetTable]] using SCD Type 1 (upsert) semantics.
*
* This node serves as a parse-time placeholder for a pipeline CDC definition and cannot be
* executed directly. It will be interpreted by the pipeline submodule once execution support
* is added (SPARK-57402). The [[source]] relation is exposed as the node's child so the analyzer
* resolves it through the normal plan resolution path.
*
* @param targetTable The target table to apply changes into.
* @param source The source relation providing the change events. Always a STREAM(...)
* source (marked as a streaming read). Exposed as the node's child.
* @param keys Column(s) that uniquely identify a row in the target table.
* @param deleteCondition An optional expression that marks a source row as a DELETE operation.
* When absent, all source rows are treated as upserts.
* @param sequenceByExpr Expression that orders CDC events to correctly resolve out-of-order
* arrivals. Must evaluate to a sortable type. Required.
* @param includeColumns An explicit list of source columns to include in the target table.
* [[None]] when no COLUMNS clause was specified. Mutually exclusive with
* [[excludeColumns]].
* @param excludeColumns Source columns to exclude from the target table (i.e., all columns
* except these). [[None]] when no COLUMNS clause was specified. Mutually
* exclusive with [[includeColumns]].
*/
case class AutoCdcIntoCommand(
targetTable: TableIdentifier,
source: LogicalPlan,
keys: Seq[UnresolvedAttribute],
deleteCondition: Option[Expression],
sequenceByExpr: Expression,
includeColumns: Option[Seq[UnresolvedAttribute]],
excludeColumns: Option[Seq[UnresolvedAttribute]]
) extends UnaryCommand {
override def child: LogicalPlan = source

override protected def withNewChildInternal(newChild: LogicalPlan): AutoCdcIntoCommand =
copy(source = newChild)
}
Original file line number Diff line number Diff line change
Expand Up @@ -824,6 +824,55 @@ case class CreateStreamingTable(
copy(name = newChild)
}

/**
* Command parsed from `CREATE STREAMING TABLE <name> FLOW AUTO CDC ...` SQL syntax.
* This command serves as a parse-time placeholder for a pipeline CDC definition and cannot be
* executed directly. It will be interpreted by the pipeline submodule once execution support
* is added (SPARK-57402).
*
* The target of the CDC operation is the streaming table itself (given by [[name]]).
*
* [[name]] and [[source]] are exposed as the node's children (left and right respectively) so the
* analyzer resolves them through the normal plan resolution path, mirroring how
* [[CreatePipelineDatasetAsSelect]] exposes its name and query.
*
* @param name The streaming table name, which also serves as the CDC target. Exposed as
* the node's left child.
* @param columns User-specified columns for the streaming table.
* @param partitioning Column-based partitioning for the streaming table.
* @param tableSpec Additional table specs.
* @param ifNotExists Whether the table should only be created if it doesn't already exist.
* @param source The source relation providing the change events. Always a STREAM(...)
* source (marked as a streaming read). Exposed as the node's right child.
* @param keys Column(s) that uniquely identify a row in the target table.
* @param deleteCondition An optional expression that marks a source row as a DELETE operation.
* @param sequenceByExpr Expression that orders CDC events to resolve out-of-order arrivals.
* @param includeColumns An explicit list of source columns to include. [[None]] when no COLUMNS
* clause was specified. Mutually exclusive with [[excludeColumns]].
* @param excludeColumns Source columns to exclude. [[None]] when no COLUMNS clause was specified.
* Mutually exclusive with [[includeColumns]].
*/
case class CreateStreamingTableAutoCdc(
name: LogicalPlan,
columns: Seq[ColumnDefinition],
partitioning: Seq[Transform],
tableSpec: TableSpecBase,
ifNotExists: Boolean,
source: LogicalPlan,
keys: Seq[UnresolvedAttribute],
deleteCondition: Option[Expression],
sequenceByExpr: Expression,
includeColumns: Option[Seq[UnresolvedAttribute]],
excludeColumns: Option[Seq[UnresolvedAttribute]]
) extends BinaryCommand with CreatePipelineDataset {
override def left: LogicalPlan = name
override def right: LogicalPlan = source

override protected def withNewChildrenInternal(
newLeft: LogicalPlan, newRight: LogicalPlan): CreateStreamingTableAutoCdc =
copy(name = newLeft, source = newRight)
}

/**
* Replace a table with a v2 catalog.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ class SparkConnectDatabaseMetaDataSuite extends ConnectFunSuite with RemoteSpark
val metadata = conn.getMetaData
// scalastyle:off line.size.limit
// CURRENT_PATH and SYSTEM are excluded: getSQLKeywords drops SQL:2003 reserved words (see companion).
assert(metadata.getSQLKeywords === "ADD,AFTER,AGGREGATE,ALIGN,ALWAYS,ANALYZE,ANTI,ANY_VALUE,APPROX,ARCHIVE,ASC,BERNOULLI,BIN,BINDING,BIN_DISTRIBUTE_RATIO,BIN_END,BIN_START,BUCKET,BUCKETS,BYTE,CACHE,CASCADE,CATALOG,CATALOGS,CHANGE,CHANGES,CLEAR,CLUSTER,CLUSTERED,CODEGEN,COLLATION,COLLATIONS,COLLECTION,COLUMNS,COMMENT,COMPACT,COMPACTIONS,COMPENSATION,COMPUTE,CONCATENATE,CONTAINS,CONTINUE,COST,CURRENT_DATABASE,CURRENT_SCHEMA,DATA,DATABASE,DATABASES,DATEADD,DATEDIFF,DATE_ADD,DATE_DIFF,DAYOFYEAR,DAYS,DBPROPERTIES,DEFAULT_PATH,DEFINED,DEFINER,DELAY,DELIMITED,DESC,DFS,DIRECTORIES,DIRECTORY,DISTANCE,DISTRIBUTE,DIV,DO,ELSEIF,ENFORCED,ESCAPED,EVOLUTION,EXACT,EXCHANGE,EXCLUDE,EXCLUSIVE,EXIT,EXPLAIN,EXPORT,EXTEND,EXTENDED,FIELDS,FILEFORMAT,FIRST,FLOW,FOLLOWING,FORMAT,FORMATTED,FOUND,FUNCTIONS,GENERATED,GEOGRAPHY,GEOMETRY,HANDLER,HOURS,IDENTIFIED,IDENTIFIER,IF,IGNORE,ILIKE,IMMEDIATE,INCLUDE,INCLUSIVE,INCREMENT,INDEX,INDEXES,INPATH,INPUT,INPUTFORMAT,INVOKER,ITEMS,ITERATE,JSON,KEY,KEYS,LAST,LAZY,LEAVE,LEVEL,LIMIT,LINES,LIST,LOAD,LOCATION,LOCK,LOCKS,LOGICAL,LONG,LOOP,MACRO,MAP,MATCHED,MATERIALIZED,MEASURE,METRICS,MICROSECOND,MICROSECONDS,MILLISECOND,MILLISECONDS,MINUS,MINUTES,MONTHS,MSCK,NAME,NAMESPACE,NAMESPACES,NANOSECOND,NANOSECONDS,NEAREST,NORELY,NULLS,OFFSET,OPTION,OPTIONS,OUTPUTFORMAT,OVERWRITE,PARTITIONED,PARTITIONS,PATH,PERCENT,PIVOT,PLACING,PRECEDING,PRINCIPALS,PROCEDURES,PROPERTIES,PURGE,QUALIFY,QUARTER,QUERY,RECORDREADER,RECORDWRITER,RECOVER,RECURSION,REDUCE,REFRESH,RELY,RENAME,REPAIR,REPEAT,REPEATABLE,REPLACE,RESET,RESPECT,RESTRICT,ROLE,ROLES,SCHEMA,SCHEMAS,SECONDS,SECURITY,SEMI,SEPARATED,SERDE,SERDEPROPERTIES,SETS,SHORT,SHOW,SIMILARITY,SINGLE,SKEWED,SORT,SORTED,SOURCE,STATISTICS,STORED,STRATIFY,STREAM,STREAMING,STRING,STRUCT,SUBSTR,SYNC,SYSTEM_PATH,SYSTEM_TIME,SYSTEM_VERSION,TABLES,TARGET,TBLPROPERTIES,TERMINATED,TIMEDIFF,TIMESTAMPADD,TIMESTAMPDIFF,TIMESTAMP_LTZ,TIMESTAMP_NTZ,TINYINT,TOUCH,TRANSACTION,TRANSACTIONS,TRANSFORM,TRUNCATE,TRY_CAST,TYPE,UNARCHIVE,UNBOUNDED,UNCACHE,UNIFORM,UNLOCK,UNPIVOT,UNSET,UNTIL,USE,VAR,VARIABLE,VARIANT,VERSION,VIEW,VIEWS,VOID,WATERMARK,WEEK,WEEKS,WHILE,WIDTH,X,YEARS,ZONE")
assert(metadata.getSQLKeywords === "ADD,AFTER,AGGREGATE,ALIGN,ALWAYS,ANALYZE,ANTI,ANY_VALUE,APPLY,APPROX,ARCHIVE,ASC,AUTO,BERNOULLI,BIN,BINDING,BIN_DISTRIBUTE_RATIO,BIN_END,BIN_START,BUCKET,BUCKETS,BYTE,CACHE,CASCADE,CATALOG,CATALOGS,CDC,CHANGE,CHANGES,CLEAR,CLUSTER,CLUSTERED,CODEGEN,COLLATION,COLLATIONS,COLLECTION,COLUMNS,COMMENT,COMPACT,COMPACTIONS,COMPENSATION,COMPUTE,CONCATENATE,CONTAINS,CONTINUE,COST,CURRENT_DATABASE,CURRENT_SCHEMA,DATA,DATABASE,DATABASES,DATEADD,DATEDIFF,DATE_ADD,DATE_DIFF,DAYOFYEAR,DAYS,DBPROPERTIES,DEFAULT_PATH,DEFINED,DEFINER,DELAY,DELIMITED,DESC,DFS,DIRECTORIES,DIRECTORY,DISTANCE,DISTRIBUTE,DIV,DO,ELSEIF,ENFORCED,ESCAPED,EVOLUTION,EXACT,EXCHANGE,EXCLUDE,EXCLUSIVE,EXIT,EXPLAIN,EXPORT,EXTEND,EXTENDED,FIELDS,FILEFORMAT,FIRST,FLOW,FOLLOWING,FORMAT,FORMATTED,FOUND,FUNCTIONS,GENERATED,GEOGRAPHY,GEOMETRY,HANDLER,HOURS,IDENTIFIED,IDENTIFIER,IF,IGNORE,ILIKE,IMMEDIATE,INCLUDE,INCLUSIVE,INCREMENT,INDEX,INDEXES,INPATH,INPUT,INPUTFORMAT,INVOKER,ITEMS,ITERATE,JSON,KEY,KEYS,LAST,LAZY,LEAVE,LEVEL,LIMIT,LINES,LIST,LOAD,LOCATION,LOCK,LOCKS,LOGICAL,LONG,LOOP,MACRO,MAP,MATCHED,MATERIALIZED,MEASURE,METRICS,MICROSECOND,MICROSECONDS,MILLISECOND,MILLISECONDS,MINUS,MINUTES,MONTHS,MSCK,NAME,NAMESPACE,NAMESPACES,NANOSECOND,NANOSECONDS,NEAREST,NORELY,NULLS,OFFSET,OPTION,OPTIONS,OUTPUTFORMAT,OVERWRITE,PARTITIONED,PARTITIONS,PATH,PERCENT,PIVOT,PLACING,PRECEDING,PRINCIPALS,PROCEDURES,PROPERTIES,PURGE,QUALIFY,QUARTER,QUERY,RECORDREADER,RECORDWRITER,RECOVER,RECURSION,REDUCE,REFRESH,RELY,RENAME,REPAIR,REPEAT,REPEATABLE,REPLACE,RESET,RESPECT,RESTRICT,ROLE,ROLES,SCHEMA,SCHEMAS,SECONDS,SECURITY,SEMI,SEPARATED,SEQUENCE,SERDE,SERDEPROPERTIES,SETS,SHORT,SHOW,SIMILARITY,SINGLE,SKEWED,SORT,SORTED,SOURCE,STATISTICS,STORED,STRATIFY,STREAM,STREAMING,STRING,STRUCT,SUBSTR,SYNC,SYSTEM_PATH,SYSTEM_TIME,SYSTEM_VERSION,TABLES,TARGET,TBLPROPERTIES,TERMINATED,TIMEDIFF,TIMESTAMPADD,TIMESTAMPDIFF,TIMESTAMP_LTZ,TIMESTAMP_NTZ,TINYINT,TOUCH,TRANSACTION,TRANSACTIONS,TRANSFORM,TRUNCATE,TRY_CAST,TYPE,UNARCHIVE,UNBOUNDED,UNCACHE,UNIFORM,UNLOCK,UNPIVOT,UNSET,UNTIL,USE,VAR,VARIABLE,VARIANT,VERSION,VIEW,VIEWS,VOID,WATERMARK,WEEK,WEEKS,WHILE,WIDTH,X,YEARS,ZONE")
// scalastyle:on line.size.limit
}
}
Expand Down
Loading