diff --git a/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4 b/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4 index 69deeb518d6e5..4aab9b5ab53d5 100644 --- a/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4 +++ b/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4 @@ -78,11 +78,11 @@ singleTableSchema statement : query #statementDefault | USE db=identifier #use - | CREATE DATABASE (IF NOT EXISTS)? identifier + | CREATE database (IF NOT EXISTS)? identifier (COMMENT comment=STRING)? locationSpec? (WITH DBPROPERTIES tablePropertyList)? #createDatabase - | ALTER DATABASE identifier SET DBPROPERTIES tablePropertyList #setDatabaseProperties - | DROP DATABASE (IF EXISTS)? identifier (RESTRICT | CASCADE)? #dropDatabase + | ALTER database identifier SET DBPROPERTIES tablePropertyList #setDatabaseProperties + | DROP database (IF EXISTS)? identifier (RESTRICT | CASCADE)? #dropDatabase | createTableHeader ('(' colTypeList ')')? tableProvider ((OPTIONS options=tablePropertyList) | (PARTITIONED BY partitionColumnNames=identifierList) | @@ -163,7 +163,7 @@ statement (LIKE? (qualifiedName | pattern=STRING))? #showFunctions | SHOW CREATE TABLE tableIdentifier #showCreateTable | (DESC | DESCRIBE) FUNCTION EXTENDED? describeFuncName #describeFunction - | (DESC | DESCRIBE) DATABASE EXTENDED? identifier #describeDatabase + | (DESC | DESCRIBE) database EXTENDED? identifier #describeDatabase | (DESC | DESCRIBE) TABLE? option=(EXTENDED | FORMATTED)? tableIdentifier partitionSpec? describeColName? #describeTable | REFRESH TABLE tableIdentifier #refreshTable @@ -274,6 +274,11 @@ partitionVal : identifier (EQ constant)? ; +database + : DATABASE + | SCHEMA + ; + describeFuncName : qualifiedName | STRING @@ -750,7 +755,7 @@ number | MINUS? BIGDECIMAL_LITERAL #bigDecimalLiteral ; -// NOTE: You must follow a rule below when you add a new ANTLR taken in this file: +// NOTE: You must follow a rule below when you add a new ANTLR token in this file: // - All the ANTLR tokens = UNION(`ansiReserved`, `ansiNonReserved`) = UNION(`defaultReserved`, `nonReserved`) // // Let's say you add a new token `NEWTOKEN` and this is not reserved regardless of a `spark.sql.parser.ansi.enabled` @@ -1014,7 +1019,8 @@ SORTED: 'SORTED'; PURGE: 'PURGE'; INPUTFORMAT: 'INPUTFORMAT'; OUTPUTFORMAT: 'OUTPUTFORMAT'; -DATABASE: 'DATABASE' | 'SCHEMA'; +SCHEMA: 'SCHEMA'; +DATABASE: 'DATABASE'; DATABASES: 'DATABASES' | 'SCHEMAS'; DFS: 'DFS'; TRUNCATE: 'TRUNCATE'; diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/SparkSqlParserSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/SparkSqlParserSuite.scala index 31b9bcdafbab8..038871cb1fc12 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/execution/SparkSqlParserSuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/SparkSqlParserSuite.scala @@ -387,4 +387,12 @@ class SparkSqlParserSuite extends AnalysisTest { "INSERT INTO tbl2 SELECT * WHERE jt.id > 4", "Operation not allowed: ALTER VIEW ... AS FROM ... [INSERT INTO ...]+") } + + test("database and schema tokens are interchangeable") { + assertEqual("CREATE DATABASE foo", parser.parsePlan("CREATE SCHEMA foo")) + assertEqual("DROP DATABASE foo", parser.parsePlan("DROP SCHEMA foo")) + assertEqual("ALTER DATABASE foo SET DBPROPERTIES ('x' = 'y')", + parser.parsePlan("ALTER SCHEMA foo SET DBPROPERTIES ('x' = 'y')")) + assertEqual("DESC DATABASE foo", parser.parsePlan("DESC SCHEMA foo")) + } }