# 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.

{
  # Generated parser implementation package and class name.
  package: "org.apache.flink.sql.parser.impl",
  class: "FlinkSqlParserImpl",

  # List of additional classes and packages to import.
  # Example. "org.apache.calcite.sql.*", "java.util.List".
  imports: [
    "org.apache.flink.sql.parser.ddl.SqlCreateTable",
    "org.apache.flink.sql.parser.ddl.SqlCreateTable.TableTempWrapper",
    "org.apache.flink.sql.parser.ddl.SqlAnalyzeTable",
    "org.apache.flink.sql.parser.ddl.SqlRichDescribeTable",
    "org.apache.flink.sql.parser.ddl.SqlCreateTable.IndexWrapper",
    "org.apache.flink.sql.parser.ddl.SqlTableColumn",
    "org.apache.flink.sql.parser.ddl.SqlCreateFunction",
    "org.apache.flink.sql.parser.ddl.SqlCreateView",
    "org.apache.flink.sql.parser.ddl.SqlWatermark",
    "org.apache.flink.sql.parser.ddl.SqlHiddenColumn",
    "java.util.List",
    "java.util.ArrayList"
  ]

  # List of new keywords. Example: "DATABASES", "TABLES". If the keyword is not a reserved
  # keyword, please also add it to 'nonReservedKeywords' section.
  keywords: [
    "COMMENT",
    "HIDDEN",
    "PROCTIME",
    "CHARACTERISTICTS",
    "HEADER",
    "ANALYZE",
    "COMPUTE",
    "STATISTICS",
    "COLUMNS",
    "INDEX",
    "EXTENDED",
    "FORMATTED"
  ]

  # List of keywords from "keywords" section that are not reserved.
  nonReservedKeywords: [
    "COMMENT",
    "HIDDEN",
    "PROCTIME",
    "HEADER",
    "ANALYZE",
    "COMPUTE",
    "STATISTICS",
    "COLUMNS",
    "INDEX",
    "EXTENDED",
    "FORMATTED"
  ]

  # List of methods for parsing custom SQL statements.
  # Return type of method implementation should be 'SqlNode'.
  # Example: SqlShowDatabases(), SqlShowTables().
  statementParserMethods: [
    "SqlCreateTable()",
    "SqlCreateFunction()",
    "SqlCreateOrReplaceView()",
    "SqlAnalyzeTable()",
    "SqlRichDescribe()"
  ]

  # List of methods for parsing custom literals.
  # Return type of method implementation should be "SqlNode".
  # Example: ParseJsonLiteral().
  literalParserMethods: [
  ]

  # List of methods for parsing custom data types.
  # Return type of method implementation should be "SqlIdentifier".
  # Example: SqlParseTimeStampZ().
  dataTypeParserMethods: [
  ]

  # List of methods for parsing extensions to "ALTER <scope>" calls.
  # Each must accept arguments "(SqlParserPos pos, String scope)".
  # Example: "SqlUploadJarNode"
  alterStatementParserMethods: [
  ]

  # List of methods for parsing extensions to "CREATE [OR REPLACE]" calls.
  # Each must accept arguments "(SqlParserPos pos, boolean replace)".
  createStatementParserMethods: [
  ]

  # List of methods for parsing extensions to "DROP" calls.
  # Each must accept arguments "(SqlParserPos pos)".
  dropStatementParserMethods: [
  ]

  # List of files in @includes directory that have parser method
  # implementations for parsing custom SQL statements, literals or types
  # given as part of "statementParserMethods", "literalParserMethods" or
  # "dataTypeParserMethods".
  implementationFiles: [
    "parserImpls.ftl"
  ]

  # List of additional join types. Each is a method with no arguments.
  # Example: LeftSemiJoin()
  joinTypes: [
  ]

  includeCompoundIdentifier: true
  includeBraces: true
  includeAdditionalDeclarations: false
}
