Full Code of melin/superior-sql-parser for AI

branch-4.0 ca42eea29ca1 cached
274 files
2.4 MB
654.0k tokens
160 symbols
1 requests
Download .txt
Showing preview only (2,632K chars total). Download the full file or copy to clipboard to get everything.
Repository: melin/superior-sql-parser
Branch: branch-4.0
Commit: ca42eea29ca1
Files: 274
Total size: 2.4 MB

Directory structure:
gitextract_hvwwon62/

├── .gitignore
├── LICENSE
├── README.md
├── pom.xml
├── superior-appjar-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── job/
│       │   │                           └── antlr4/
│       │   │                               ├── AppJarLexer.g4
│       │   │                               └── AppJarParser.g4
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── appjar/
│       │                               ├── AbstractJarParser.kt
│       │                               ├── AppJarAntlr4Visitor.kt
│       │                               ├── AppJarHelper.kt
│       │                               └── AppJarInfo.kt
│       └── test/
│           ├── kotlin/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── appjar/
│           │                           └── AppJarParserTest.kt
│           └── resources/
│               └── log4j2.xml
├── superior-arithmetic-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── antlr4/
│       │   │                           └── arithmetic/
│       │   │                               └── Arithmetic.g4
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── arithmetic/
│       │                               ├── AbstractArithParser.kt
│       │                               ├── ArithmeticAntlr4Visitor.kt
│       │                               ├── ArithmeticHelper.kt
│       │                               └── Data.kt
│       └── test/
│           ├── kotlin/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── arithmetic/
│           │                           └── ArithmetricParserTest.kt
│           └── resources/
│               └── log4j2.xml
├── superior-common-parser/
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── common/
│           │                       └── antlr4/
│           │                           ├── AntlrCaches.java
│           │                           ├── Origin.java
│           │                           ├── ParseErrorListener.java
│           │                           ├── ParseException.java
│           │                           ├── ParserUtils.java
│           │                           └── UpperCaseCharStream.java
│           └── kotlin/
│               └── io/
│                   └── github/
│                       └── melin/
│                           └── superior/
│                               └── common/
│                                   ├── AlterActionType.kt
│                                   ├── PrivilegeType.kt
│                                   ├── SQLParserException.kt
│                                   ├── SqlType.kt
│                                   ├── StatementType.kt
│                                   ├── TableType.kt
│                                   ├── relational/
│                                   │   ├── AnalyzeTable.kt
│                                   │   ├── DefaultStatement.kt
│                                   │   ├── FunctionId.kt
│                                   │   ├── ProcedureId.kt
│                                   │   ├── SchemaId.kt
│                                   │   ├── Statement.kt
│                                   │   ├── TableId.kt
│                                   │   ├── abs/
│                                   │   │   ├── AbsDatabaseStatement.kt
│                                   │   │   └── AbsTableStatement.kt
│                                   │   ├── alter/
│                                   │   │   ├── AlterAction.kt
│                                   │   │   ├── AlterActions.kt
│                                   │   │   ├── AlterDatabase.kt
│                                   │   │   ├── AlterDatabaseActions.kt
│                                   │   │   ├── AlterMaterializedView.kt
│                                   │   │   ├── AlterTable.kt
│                                   │   │   ├── AlterView.kt
│                                   │   │   ├── DeltaAlterActions.kt
│                                   │   │   └── IcebergAlterActions.kt
│                                   │   ├── common/
│                                   │   │   ├── AddResourceStatement.kt
│                                   │   │   ├── CallProcedure.kt
│                                   │   │   ├── CancelExport.kt
│                                   │   │   ├── CommentStatement.kt
│                                   │   │   ├── DescModel.kt
│                                   │   │   ├── ListResourceStatement.kt
│                                   │   │   ├── ReSetStatement.kt
│                                   │   │   ├── RefreshMaterializedView.kt
│                                   │   │   ├── RemoveResourceStatement.kt
│                                   │   │   ├── SetStatement.kt
│                                   │   │   ├── ShowStatement.kt
│                                   │   │   ├── SyncStatement.kt
│                                   │   │   └── UseStatement.kt
│                                   │   ├── create/
│                                   │   │   ├── CreateCatalog.kt
│                                   │   │   ├── CreateDatabase.kt
│                                   │   │   ├── CreateFunction.kt
│                                   │   │   ├── CreateMaterializedView.kt
│                                   │   │   ├── CreateProcedure.kt
│                                   │   │   ├── CreateSchema.kt
│                                   │   │   ├── CreateTable.kt
│                                   │   │   ├── CreateTableAsSelect.kt
│                                   │   │   ├── CreateTableLike.kt
│                                   │   │   └── CreateView.kt
│                                   │   ├── delta/
│                                   │   │   ├── OptimizeTable.kt
│                                   │   │   └── VacuumTable.kt
│                                   │   ├── dml/
│                                   │   │   ├── DeleteTable.kt
│                                   │   │   ├── InsertFiles.kt
│                                   │   │   ├── InsertMode.kt
│                                   │   │   ├── InsertMultiTable.kt
│                                   │   │   ├── InsertTable.kt
│                                   │   │   ├── MergeTable.kt
│                                   │   │   ├── QueryStmt.kt
│                                   │   │   └── UpdateTable.kt
│                                   │   ├── drop/
│                                   │   │   ├── DropCatalog.kt
│                                   │   │   ├── DropDatabase.kt
│                                   │   │   ├── DropFunction.kt
│                                   │   │   ├── DropMaterializedView.kt
│                                   │   │   ├── DropProcedure.kt
│                                   │   │   ├── DropSchema.kt
│                                   │   │   ├── DropSequence.kt
│                                   │   │   ├── DropTable.kt
│                                   │   │   └── DropView.kt
│                                   │   ├── enums.kt
│                                   │   ├── io/
│                                   │   │   ├── AlterLoadTable.kt
│                                   │   │   ├── CancelLoadTable.kt
│                                   │   │   ├── ExportTable.kt
│                                   │   │   └── LoadTable.kt
│                                   │   └── table/
│                                   │       ├── ColumnRel.kt
│                                   │       ├── RepairTable.kt
│                                   │       └── TruncateTable.kt
│                                   ├── type/
│                                   │   ├── AbsDataTimeType.kt
│                                   │   ├── AbsNumericType.kt
│                                   │   ├── AbsStringType.kt
│                                   │   ├── AbsType.kt
│                                   │   └── Type.kt
│                                   └── util/
│                                       ├── CommonUtils.kt
│                                       └── DateUtils.kt
├── superior-dameng-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── dameng/
│       │   │                           └── antlr4/
│       │   │                               ├── DmSqlLexer.g4
│       │   │                               └── DmSqlParser.g4
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── dameng/
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── DmSqlAntlr4Visitor.kt
│       │                               └── DmSqlHelper.kt
│       └── test/
│           ├── kotlin/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── dameng/
│           │                           ├── DmSqlParserDdlTest.kt
│           │                           ├── DmSqlParserDmlTest.kt
│           │                           └── DmSqlProcedureParserTest.kt
│           └── resources/
│               ├── insert.sql
│               └── log4j2.xml
├── superior-flink-parser/
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── flink/
│       │   │                           └── antlr4/
│       │   │                               ├── FlinkSqlLexer.g4
│       │   │                               └── FlinkSqlParser.g4
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── flink/
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── FlinkSqlAntlr4Visitor.kt
│       │                               └── FlinkSqlHelper.kt
│       └── test/
│           ├── kotlin/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── flink/
│           │                           ├── FlinkCheckSql.kt
│           │                           ├── FlinkSqlParserDdlTest.kt
│           │                           └── FlinkSqlParserDmlTest.kt
│           └── resources/
│               └── log4j2.xml
├── superior-mysql-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── mysql/
│       │   │                           └── antlr4/
│       │   │                               ├── MySqlLexer.g4
│       │   │                               └── MySqlParser.g4
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── mysql/
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── MySqlAntlr4Visitor.kt
│       │                               ├── MySqlHelper.kt
│       │                               └── type/
│       │                                   ├── JsonType.kt
│       │                                   ├── datetime.kt
│       │                                   ├── numeric.kt
│       │                                   └── string.kt
│       └── test/
│           ├── kotlin/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── mysql/
│           │                           ├── MySqlParserDdlTest.kt
│           │                           ├── MySqlParserDmlTest.kt
│           │                           └── MySqlProcedureParserTest.kt
│           └── resources/
│               └── log4j2.xml
├── superior-oracle-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── oracle/
│       │   │                           └── antlr4/
│       │   │                               ├── OracleLexer.g4
│       │   │                               └── OracleParser.g4
│       │   ├── java/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── oracle/
│       │   │                           └── antlr4/
│       │   │                               ├── OracleLexerBase.java
│       │   │                               └── OracleParserBase.java
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── oracle/
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── OracleSqlAntlr4Visitor.kt
│       │                               └── OracleSqlHelper.kt
│       └── test/
│           ├── java/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── oracle/
│           │                           ├── OracleProcessParserTest.kt
│           │                           ├── OracleSqlParserDdlTest.kt
│           │                           └── OracleSqlParserDmlTest.kt
│           └── resources/
│               ├── insert.sql
│               └── log4j2.xml
├── superior-postgres-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── postgre/
│       │   │                           └── antlr4/
│       │   │                               ├── PostgreSqlLexer.g4
│       │   │                               └── PostgreSqlParser.g4
│       │   ├── java/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── postgre/
│       │   │                           └── antlr4/
│       │   │                               ├── LexerDispatchingErrorListener.java
│       │   │                               ├── ParserDispatchingErrorListener.java
│       │   │                               ├── PostgreSqlLexerBase.java
│       │   │                               └── PostgreSqlParserBase.java
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── postgre/
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── PostgreSqlAntlr4Visitor.kt
│       │                               ├── PostgreSqlHelper.kt
│       │                               ├── relational/
│       │                               │   └── CreatePartitionTable.kt
│       │                               └── type/
│       │                                   ├── BooleanType.kt
│       │                                   ├── JsonType.kt
│       │                                   ├── datetime.kt
│       │                                   ├── numeric.kt
│       │                                   └── string.kt
│       └── test/
│           ├── java/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── postgre/
│           │                           ├── PostgreSqlParserDdlTest.kt
│           │                           ├── PostgreSqlParserDmlTest.kt
│           │                           └── PostgreSqlProcessParserTest.kt
│           └── resources/
│               └── log4j2.xml
├── superior-presto-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── presto/
│       │   │                           └── antlr4/
│       │   │                               └── PrestoSqlBase.g4
│       │   ├── java/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── presto/
│       │   │                           └── CaseInsensitiveStream.java
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── presto/
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── PrestoSqlAntlr4Visitor.kt
│       │                               └── PrestoSqlHelper.kt
│       └── test/
│           ├── kotlin/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── presto/
│           │                           └── PrestoSqlParserTest.kt
│           └── resources/
│               └── log4j2.xml
├── superior-redshift-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── redshift/
│       │   │                           └── antlr4/
│       │   │                               ├── RedshiftLexer.g4
│       │   │                               └── RedshiftParser.g4
│       │   ├── java/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── redshift/
│       │   │                           └── antlr4/
│       │   │                               ├── LexerDispatchingErrorListener.java
│       │   │                               ├── ParserDispatchingErrorListener.java
│       │   │                               ├── RedshiftLexerBase.java
│       │   │                               └── RedshiftParserBase.java
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── postgre/
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── RedshiftSqlAntlr4Visitor.kt
│       │                               ├── RedshiftSqlHelper.kt
│       │                               ├── relational/
│       │                               │   └── CreatePartitionTable.kt
│       │                               └── type/
│       │                                   ├── BooleanType.kt
│       │                                   ├── JsonType.kt
│       │                                   ├── datetime.kt
│       │                                   ├── numeric.kt
│       │                                   └── string.kt
│       └── test/
│           ├── java/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── postgre/
│           │                           ├── RedshiftSqlParserDdlTest.kt
│           │                           ├── RedshiftSqlParserDmlTest.kt
│           │                           └── RedshiftSqlProcessParserTest.kt
│           └── resources/
│               └── log4j2.xml
├── superior-spark-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── spark/
│       │   │                           └── antlr4/
│       │   │                               ├── SparkSqlLexer.g4
│       │   │                               ├── SparkSqlParser.g4
│       │   │                               ├── SparkStreamSqlLexer.g4
│       │   │                               └── SparkStreamSqlParser.g4
│       │   ├── java/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── spark/
│       │   │                           └── SparkSqlPostProcessor.java
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── spark/
│       │                               ├── AbstractSparkStreamSqlParser.kt
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── SparkSqlAntlr4Visitor.kt
│       │                               ├── SparkSqlHelper.kt
│       │                               ├── SparkStreamSqlAntlr4Visitor.kt
│       │                               ├── SparkStreamSqlHelper.kt
│       │                               └── relational/
│       │                                   ├── CallHelp.kt
│       │                                   ├── CreateFileView.kt
│       │                                   ├── CreateTempViewUsing.kt
│       │                                   ├── DataTunnelExpr.kt
│       │                                   ├── DataTunnelHelp.kt
│       │                                   ├── DistCpExpr.kt
│       │                                   ├── LoadData.kt
│       │                                   ├── MergeFileData.kt
│       │                                   ├── RefreshStatement.kt
│       │                                   └── cache.kt
│       └── test/
│           ├── kotlin/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── spark/
│           │                           ├── DeltaSqlExtensionsTest.kt
│           │                           ├── IcebergSqlExtensionsTest.kt
│           │                           ├── SparkSqlParserTest.kt
│           │                           └── SparkStreamSqlParserTest.kt
│           └── resources/
│               ├── demo.sql
│               └── log4j2.xml
├── superior-sqlserver-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── sqlserver/
│       │   │                           └── antlr4/
│       │   │                               ├── SqlServerLexer.g4
│       │   │                               └── SqlServerParser.g4
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── sqlserver/
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── SqlServerAntlr4Visitor.kt
│       │                               └── SqlServerHelper.kt
│       └── test/
│           ├── kotlin/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── sqlserver/
│           │                           ├── SqlServerParserDdlTest.kt
│           │                           └── SqlServerParserDmlTest.kt
│           └── resources/
│               └── log4j2.xml
├── superior-starrocks-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── starrocks/
│       │   │                           └── antlr4/
│       │   │                               ├── StarRocksLexer.g4
│       │   │                               └── StarRocksParser.g4
│       │   ├── java/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── starrocks/
│       │   │                           ├── NodePosition.java
│       │   │                           ├── ParsingException.java
│       │   │                           ├── PostProcessListener.java
│       │   │                           └── SqlModeHelper.java
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── starrocks/
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── StarRocksAntlr4Visitor.kt
│       │                               ├── StarRocksHelper.kt
│       │                               └── relational/
│       │                                   ├── AlterRoutineLoad.kt
│       │                                   ├── CancelRefreshMaterializedView.kt
│       │                                   ├── CreateRoutineLoad.kt
│       │                                   ├── DropTask.kt
│       │                                   ├── PauseRoutineLoad.kt
│       │                                   ├── ResumeRoutineLoad.kt
│       │                                   ├── StopRoutineLoad.kt
│       │                                   └── SubmitTask.kt
│       └── test/
│           ├── kotlin/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── starrocks/
│           │                           ├── StarRocksSqlParserDdlTest.kt
│           │                           ├── StarRocksSqlParserDmlTest.kt
│           │                           ├── StarRocksSqlParserLoadAndExportTest.kt
│           │                           └── StarRocksSqlParserRoutineLoadTest.kt
│           └── resources/
│               └── log4j2.xml
└── superior-trino-parser/
    ├── pom.xml
    └── src/
        ├── main/
        │   ├── antlr4/
        │   │   └── io/
        │   │       └── github/
        │   │           └── melin/
        │   │               └── superior/
        │   │                   └── parser/
        │   │                       └── trino/
        │   │                           └── antlr4/
        │   │                               └── TrinoSqlBase.g4
        │   ├── java/
        │   │   └── io/
        │   │       └── github/
        │   │           └── melin/
        │   │               └── superior/
        │   │                   └── parser/
        │   │                       └── trino/
        │   │                           └── CaseInsensitiveStream.java
        │   └── kotlin/
        │       └── io/
        │           └── github/
        │               └── melin/
        │                   └── superior/
        │                       └── parser/
        │                           └── trino/
        │                               ├── AbstractSqlParser.kt
        │                               ├── TrinoSqlAntlr4Visitor.kt
        │                               └── TrinoSqlHelper.kt
        └── test/
            ├── kotlin/
            │   └── io/
            │       └── github/
            │           └── melin/
            │               └── superior/
            │                   └── parser/
            │                       └── trino/
            │                           └── TrinoSqlParserTest.kt
            └── resources/
                └── log4j2.xml

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Created by .ignore support plugin (hsz.mobi)
target
.idea
superior-sql-parser.iml
metastore_db
derby.log
.DS_Store
gen
*.tokens
*.iml

================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright 2022 Ververica Inc.

   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.


================================================
FILE: README.md
================================================
## 介绍

基于 antlr4 的多种数据库SQL解析器,获取SQL中元数据,可用于数据平台产品中的多个场景:ddl语句提取元数据、sql 权限校验、表级血缘、sql语法校验等场景。支持spark、flink、gauss、starrocks、Oracle、MYSQL、Postgresql,sqlserver,、db2等
```xml
<dependency>
    <groupId>io.github.melin.superior</groupId>
    <artifactId>superior-[spark|presto|mysql|oracle|...]-parser</artifactId>
    <version>4.0.22</version>
</dependency>
```

## Build
```
export GPG_TTY=$(tty)
mvn clean deploy -Pdeploy
```

### API

每个数据库SQL 提供 Helper 类,Helper 方法提供四个方法:
```agsl
1. parseStatement(String sql) // 解析单个完整sql
    a. ddl: 获取ddl 详细信息。例如:数据库执行完ddl以后,解析ddl,获取到相关信息,同步到元数据信息。
    b. dml: 获取sql中使用到的表,用于构建表级血缘,或者校验表权限。
2. parseMultiStatement(String sql) // 解析多个完整sql,支持空格、换行、分号分隔
3. splitSql(String sql) // sql 文本包含多个完整sql,方法用于分隔sql语句,支持空格、换行、分号分隔
4. checkSqlSyntax(String sql) // 验证单个完整sql语法是否正确
5. sqlKeywords() // 获取sql 关键字,主要用于sql editor 关键字提示
```

## Example

```kotlin
// Spark SQL
val sql = "select bzdys, bzhyyh, bzdy, week, round((bzdy-bzdys)*100/bzdys, 2) " +
        "from (select lag(bzdy) over (order by week) bzdys, bzhyyh, bzdy, week " +
        "from (select count(distinct partner_code) bzhyyh, count(1) bzdy, week from tdl_dt2x_table)) limit 111"

val statement = SparkSQLHelper.parseStatement(sql)
if (statement is QueryStmt) {
    Assert.assertEquals(StatementType.SELECT, statement.statementType)
    Assert.assertEquals(1, statement.inputTables.size)
    Assert.assertEquals("tdl_dt2x_table", statement.inputTables.get(0).tableName)
    Assert.assertEquals(111, statement.limit)
} else {
    Assert.fail()
}

// Spark Jar
val sql = """
    set spark.shuffle.compress=true;set spark.rdd.compress=true;
    set spark.driver.maxResultSize=3g;
    set spark.serializer=org.apache.spark.serializer.KryoSerializer;
    set spark.kryoserializer.buffer.max=1024m;
    set spark.kryoserializer.buffer=256m;
    set spark.network.timeout=300s;
    examples-jar-with-dependencies.jar imei_test.euSaveHBase gaea_offline:account_mobile sh md shda.interest_radar_mobile_score_dt 20180318 /xiaoyong.fu/sh/mobile/loan 400 '%7B%22job_type%22=' --jar
    """;

val statementDatas = JobTaskHelper.parseStatement(sql)
Assert.assertEquals(8, statementDatas.size)
var statementData = statementDatas.get(7)
var statement = statementData.statement
if (statement is JobData) {
    Assert.assertEquals(StatementType.JOB, statement.statementType)
    Assert.assertEquals("createHfile-1.2-SNAPSHOT-jar-with-dependencies.jar", statement.resourceName)
    Assert.assertEquals("imei_test.euSaveHBase", statement.className)
    Assert.assertEquals("/xiaoyong.fu/sh/mobile/loan", statement.params?.get(5))
    Assert.assertEquals("400", statement.params?.get(6))
    Assert.assertEquals("%7B%22job_type%22=", statement.params?.get(7))
    Assert.assertEquals("--jar", statement.params?.get(8))
} else {
    Assert.fail()
}

// MySQL
val sql = "insert into bigdata.user select * from users a left outer join address b on a.address_id = b.id"
val statement = MySQLHelper.parseStatement(sql)
if(statement is QueryStmt) {
    Assert.assertEquals(StatementType.INSERT_SELECT, statement.statementType)
    Assert.assertEquals("bigdata", statement.outpuTables.get(0).databaseName)
    Assert.assertEquals("user", statement.outpuTables.get(0).tableName)
    Assert.assertEquals(2, statement.inputTables.size)
} else {
    Assert.fail()
}

// Postgres
val sql = """
    select a.* from datacompute1.datacompute.dc_job a left join datacompute1.datacompute.dc_job_scheduler b on a.id=b.job_id
""".trimIndent()

val statement = PostgreSQLHelper.parseStatement(sql)
if (statement is QueryStmt) {
    Assert.assertEquals(StatementType.SELECT, statement.statementType)
    Assert.assertEquals(2, statement.inputTables.size)
} else {
    Assert.fail()
}
```

## 支持数据库
1. [MySQL](https://github.com/antlr/grammars-v4/tree/master/sql/mysql)
2. [PrestoSQL](https://github.com/prestosql/presto/tree/master/presto-parser/src/main/antlr4/io/prestosql/sql/parser)
3. [PostgreSQL](https://github.com/pgcodekeeper/pgcodekeeper/tree/master/apgdiff/antlr-src)
4. [Spark 3.x](https://github.com/apache/spark/tree/master/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser)
5. [Sql Server](https://github.com/antlr/grammars-v4/tree/master/sql/tsql) 
6. [StarRocks](https://github.com/StarRocks/starrocks/tree/main/fe/fe-core/src/main/java/com/starrocks/sql/parser)
7. [Oracle](https://github.com/antlr/grammars-v4/tree/master/sql/plsql)
8. [OceanBase](https://github.com/oceanbase/odc/tree/main/libs/ob-sql-parser)
9. [Flink SQL / Flink CDC SQL](https://github.com/DTStack/dt-sql-parser/tree/main/src/grammar/flinksql)

## 相关项目
1. https://gitee.com/melin/bee
2. https://github.com/melin/sqlflow/ 字段血缘解析
3. https://github.com/melin/superior-sql-formatter spark sql 代码格式化
4. https://github.com/melin/datatunnel spark 数据同步工具
5. https://github.com/melin/flink-jobserver 
6. https://github.com/melin/spark-jobserver



================================================
FILE: pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>io.github.melin.superior</groupId>
    <artifactId>superior-sql-parser</artifactId>
    <version>4.0.23</version>
    <packaging>pom</packaging>
    <name>Superior SQL Parser</name>

    <description>Superior SQL Parser</description>

    <modules>
        <module>superior-common-parser</module>
        <module>superior-arithmetic-parser</module>
        <module>superior-appjar-parser</module>

        <module>superior-spark-parser</module>
        <module>superior-mysql-parser</module>
        <module>superior-postgres-parser</module>
        <module>superior-trino-parser</module>
        <module>superior-presto-parser</module>
        <module>superior-sqlserver-parser</module>
        <module>superior-flink-parser</module>
        <module>superior-oracle-parser</module>
        <module>superior-dameng-parser</module>
        <module>superior-starrocks-parser</module>
        <module>superior-redshift-parser</module>
    </modules>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <kotlin.compiler.incremental>true</kotlin.compiler.incremental>

        <kotlin.version>2.3.20</kotlin.version>
        <antlr4.version>4.9.3</antlr4.version>
        <slf4j.version>2.0.17</slf4j.version>
        <log4j.version>2.25.3</log4j.version>
        <commons-lang3.version>3.20.0</commons-lang3.version>
        <commons-io.version>2.21.0</commons-io.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.antlr</groupId>
            <artifactId>antlr4-runtime</artifactId>
            <version>${antlr4.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.jetbrains.kotlin</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-stdlib</artifactId>
            <version>${kotlin.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>${commons-lang3.version}</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>33.4.0-jre</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>${commons-io.version}</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${log4j.version}</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>${log4j.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
                <version>3.12.0</version>
                <inherited>true</inherited>
                <configuration>
                    <maxmemory>1024</maxmemory>
                    <encoding>UTF-8</encoding>
                    <show>protected</show>
                    <notree>true</notree>

                    <!-- Avoid running into Java 8's very restrictive doclint issues -->
                    <failOnError>false</failOnError>
                    <doclint>none</doclint>
                </configuration>
                <executions>
                    <execution>
                        <id>bundle-sources</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                        <phase>package</phase>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.5.4</version>
            </plugin>

            <plugin>
                <groupId>org.jetbrains.kotlin</groupId>
                <artifactId>kotlin-maven-plugin</artifactId>
                <version>${kotlin.version}</version>
                <extensions>true</extensions>
                <executions>
                    <execution>
                        <id>compile</id>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <phase>process-sources</phase>
                        <configuration>
                            <sourceDirs>
                                <sourceDir>${project.basedir}/src/main/kotlin</sourceDir>
                                <sourceDir>${project.basedir}/src/main/java</sourceDir>
                                <sourceDir>${project.build.directory}/generated-sources/antlr4</sourceDir>
                            </sourceDirs>
                        </configuration>
                    </execution>
                    <execution>
                        <id>test-compile</id>
                        <goals>
                            <goal>test-compile</goal>
                        </goals>
                        <configuration>
                            <sourceDirs>
                                <sourceDir>${project.basedir}/src/test/kotlin</sourceDir>
                                <sourceDir>${project.basedir}/src/test/java</sourceDir>
                            </sourceDirs>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
                <executions>
                    <!-- Replacing default-compile as it is treated specially by maven -->
                    <execution>
                        <id>default-compile</id>
                        <phase>none</phase>
                    </execution>
                    <!-- Replacing default-testCompile as it is treated specially by maven -->
                    <execution>
                        <id>default-testCompile</id>
                        <phase>none</phase>
                    </execution>
                    <execution>
                        <id>java-compile</id>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <phase>compile</phase>
                    </execution>
                    <execution>
                        <id>java-test-compile</id>
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                        <phase>test-compile</phase>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.antlr</groupId>
                <artifactId>antlr4-maven-plugin</artifactId>
                <version>${antlr4.version}</version>
                <configuration>
                    <!--<listener>true</listener>-->
                    <visitor>true</visitor>
                    <!--<treatWarningsAsErrors>true</treatWarningsAsErrors>-->
                </configuration>
                <executions>
                    <execution>
                        <id>antlr</id>
                        <goals>
                            <goal>antlr4</goal>
                        </goals>
                        <phase>generate-sources</phase>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-release-plugin</artifactId>
                <configuration>
                    <mavenExecutorId>forked-path</mavenExecutorId>
                    <useReleaseProfile>false</useReleaseProfile>
                    <arguments>-Psonatype-oss-release</arguments>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>3.4.0</version>
                <inherited>true</inherited>
                <configuration>
                    <excludeResources>true</excludeResources>
                    <useDefaultExcludes>true</useDefaultExcludes>
                </configuration>
                <executions>
                    <execution>
                        <id>attach-sources</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

    <profiles>
        <profile>
            <id>deploy</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-gpg-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>sign-artifacts</id>
                                <goals>
                                    <goal>sign</goal>
                                </goals>
                                <phase>verify</phase>
                            </execution>
                        </executions>
                    </plugin>

                    <plugin>
                        <groupId>org.sonatype.central</groupId>
                        <artifactId>central-publishing-maven-plugin</artifactId>
                        <version>0.10.0</version>
                        <extensions>true</extensions>
                        <configuration>
                            <deploymentName>superior-sql-parser-${project.version}</deploymentName>
                            <publishingServerId>central</publishingServerId>
                            <autoPublish>true</autoPublish>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

    <url>https://github.com/melin/superior-sql-parser</url>

    <licenses>
        <license>
            <name>The Apache Software License, Version 2.0</name>
            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
            <distribution>repo</distribution>
        </license>
    </licenses>

    <developers>
        <developer>
            <name>melin</name>
            <email>libinsong1204@gmail.com</email>
            <url>https://github.com/melin/superior-sql-parser</url>
        </developer>
    </developers>

    <scm>
        <connection>scm:git:https://github.com/melin/superior-sql-parser.git</connection>
        <developerConnection>scm:git:https://github.com/melin/superior-sql-parser.git</developerConnection>
        <url>https://github.com/melin/superior-sql-parser</url>
    </scm>

    <issueManagement>
        <system>gitee</system>
        <url>https://github.com/melin/superior-sql-parser/issues</url>
    </issueManagement>

</project>


================================================
FILE: superior-appjar-parser/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>io.github.melin.superior</groupId>
        <artifactId>superior-sql-parser</artifactId>
        <version>4.0.23</version>
    </parent>

    <artifactId>superior-appjar-parser</artifactId>
    <name>superior-appjar-parser</name>

    <dependencies>
        <dependency>
            <groupId>io.github.melin.superior</groupId>
            <artifactId>superior-common-parser</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</project>


================================================
FILE: superior-appjar-parser/src/main/antlr4/io/github/melin/superior/parser/job/antlr4/AppJarLexer.g4
================================================
lexer grammar AppJarLexer;

channels { DCSTREAMCOMMENT, ERRORCHANNEL }

// SKIP

SPACE:                               [ \t\r\n]+    -> channel(HIDDEN);
SPEC_MYSQL_COMMENT:                  '/*!' .+? '*/' -> channel(DCSTREAMCOMMENT);
COMMENT_INPUT:                       '/*' .*? '*/' -> channel(HIDDEN);
LINE_COMMENT:                        (
                                       ('-- ' | '#') ~[\r\n]* ('\r'? '\n' | EOF)
                                       | '--' ('\r'? '\n' | EOF)
                                     ) -> channel(HIDDEN);

SET:                                 'SET';
RESET:                               'RESET';

STAR:                                '*';
DIVIDE:                              '/';
MODULE:                              '%';
PLUS:                                '+';
MINUS:                               '-';

// Operators. Comparation
EQUAL_SYMBOL:                        '=';
GREATER_SYMBOL:                      '>';
LESS_SYMBOL:                         '<';
EXCLAMATION_SYMBOL:                  '!';


// Operators. Bit
BIT_NOT_OP:                          '~';
BIT_OR_OP:                           '|';
BIT_AND_OP:                          '&';
BIT_XOR_OP:                          '^';

// Constructors symbols
DOT:                                 '.';
LR_BRACKET:                          '(';
RR_BRACKET:                          ')';
COMMA:                               ',';
SEMI:                                ';';

DOT_ID:                              '.' ID_LITERAL;

ID:                                  ID_LITERAL;
REVERSE_QUOTE_ID:                    '`' ~'`'+ '`';
STRING_LITERAL:                      DQUOTA_STRING | SQUOTA_STRING;

fragment ID_LITERAL:                 [A-Z_$0-9,:-]*;
fragment DQUOTA_STRING:              '"' ( '\\'. | '""' | ~('"'| '\\') )* '"';
fragment SQUOTA_STRING:              '\'' ('\\'. | '\'\'' | ~('\'' | '\\'))* '\'';

ERROR_RECONGNIGION:                  .    -> channel(ERRORCHANNEL);

================================================
FILE: superior-appjar-parser/src/main/antlr4/io/github/melin/superior/parser/job/antlr4/AppJarParser.g4
================================================
parser grammar AppJarParser;

options { tokenVocab=AppJarLexer; }

rootx
    : jobTasks? EOF
    ;

jobTasks
    : (jobTask SEMI | emptyStatement)*
    (jobTask (SEMI)? | emptyStatement)
    ;

jobTask
    :  setStatement | resetStatement | jobStatement
    ;

jobStatement
    : resourceNameExpr classNameExpr paramsExpr?
    ;

resourceNameExpr
    : ID (DOT_ID)*
    | fileDir
    ;

classNameExpr
    : ID (DOT_ID)*
    ;

paramsExpr
    : paramExpr (paramExpr)*
    ;

paramExpr
    : ID (DOT_ID)*
    | fileDir
    | ID DOT_ID* ('/' '/'? ID DOT_ID*)*
    | STRING_LITERAL
    ;

fileDir
    : '/' ID DOT_ID* ('/' (ID DOT_ID* | '*'))* '/'?
    ;

setStatement
    : SET keyExpr EQUAL_SYMBOL value=valueExpr
    ;

resetStatement
    : RESET keyExpr
    ;

keyExpr
    : ID (DOT_ID)*
    ;

valueExpr
    : word (word)*
    ;

word
    : ID
    | DOT_ID | SET | RESET
    | STAR | DIVIDE | MODULE | PLUS | MINUS
    | EQUAL_SYMBOL | GREATER_SYMBOL | LESS_SYMBOL | EXCLAMATION_SYMBOL
    | BIT_NOT_OP | BIT_OR_OP | BIT_AND_OP | BIT_XOR_OP
    | LR_BRACKET | RR_BRACKET | COMMA
    | STRING_LITERAL
    ;

emptyStatement
    : SEMI
    ;


================================================
FILE: superior-appjar-parser/src/main/kotlin/io/github/melin/superior/parser/appjar/AbstractJarParser.kt
================================================
package io.github.melin.superior.parser.appjar

import io.github.melin.superior.common.antlr4.AntlrCaches
import io.github.melin.superior.parser.job.antlr4.AppJarParser
import java.util.concurrent.atomic.AtomicReference

object AbstractJarParser {
    private val parserCaches = AtomicReference<AntlrCaches>(AntlrCaches(AppJarParser._ATN))

    /**
     * Install the parser caches into the given parser.
     *
     * This method should be called before parsing any input.
     */
    fun installCaches(parser: AppJarParser): Unit = parserCaches.get().installCaches(parser)

    /**
     * Drop the existing parser caches and create a new one.
     *
     * ANTLR retains caches in its parser that are never released. This speeds up parsing of future input, but it can
     * consume a lot of memory depending on the input seen so far.
     *
     * This method provides a mechanism to free the retained caches, which can be useful after parsing very large SQL
     * inputs, especially if those large inputs are unlikely to be similar to future inputs seen by the driver.
     */
    fun refreshParserCaches() {
        parserCaches.set(AntlrCaches(AppJarParser._ATN))
    }
}


================================================
FILE: superior-appjar-parser/src/main/kotlin/io/github/melin/superior/parser/appjar/AppJarAntlr4Visitor.kt
================================================
package io.github.melin.superior.parser.appjar

import com.github.melin.superior.sql.parser.util.CommonUtils
import io.github.melin.superior.common.antlr4.ParserUtils.source
import io.github.melin.superior.common.relational.Statement
import io.github.melin.superior.common.relational.common.ReSetStatement
import io.github.melin.superior.common.relational.common.SetStatement
import io.github.melin.superior.parser.job.antlr4.AppJarParser
import io.github.melin.superior.parser.job.antlr4.AppJarParserBaseVisitor
import org.apache.commons.lang3.StringUtils

/** Created by binsong.li on 2018/3/31 下午1:44 */
class AppJarAntlr4Visitor : AppJarParserBaseVisitor<Statement>() {

    private var command: String? = null

    private val jobStmts = ArrayList<Statement>()

    override fun visitJobTask(ctx: AppJarParser.JobTaskContext): Statement {
        val jobStmt = super.visitJobTask(ctx)
        val sql = source(ctx)
        jobStmt.setSql(sql)

        jobStmts.add(jobStmt)
        return jobStmt
    }

    override fun visitJobStatement(ctx: AppJarParser.JobStatementContext): Statement {
        val resourceName = ctx.resourceNameExpr().text
        val className = ctx.classNameExpr().text

        val params: ArrayList<String> = arrayListOf()

        if (ctx.paramsExpr() != null) {
            ctx.paramsExpr().children.forEach { item ->
                val param = item as AppJarParser.ParamExprContext
                var value = source(param)
                if (StringUtils.startsWith(value, "/")) { // 解决连续多个文件路径,不能正确解析
                    value = replaceWhitespace(value)

                    params.addAll(StringUtils.split(value, " "))
                } else {
                    value = CommonUtils.cleanQuote(value)
                    params.add(value)
                }
            }
        }

        return AppJarInfo(resourceName, className, params)
    }

    override fun visitSetStatement(ctx: AppJarParser.SetStatementContext): Statement {
        val key = ctx.keyExpr().text
        val value = CommonUtils.cleanQuote(source(ctx.value))

        return SetStatement(key, value)
    }

    override fun visitResetStatement(ctx: AppJarParser.ResetStatementContext): Statement {
        val key = ctx.keyExpr().text
        return ReSetStatement(key)
    }

    private fun replaceWhitespace(str: String): String {
        val len = str.length
        if (len > 0) {
            val dest = CharArray(len)
            var destPos = 0
            for (i in 0 until len) {
                val c = str[i]
                if (!Character.isWhitespace(c)) {
                    dest[destPos++] = c
                } else {
                    dest[destPos++] = ' '
                }
            }
            return String(dest, 0, destPos)
        }
        return str
    }

    fun getJobStmts(): ArrayList<Statement> {
        return jobStmts
    }

    fun setCommand(command: String) {
        this.command = command
    }
}


================================================
FILE: superior-appjar-parser/src/main/kotlin/io/github/melin/superior/parser/appjar/AppJarHelper.kt
================================================
package io.github.melin.superior.parser.appjar

import com.github.melin.superior.sql.parser.util.CommonUtils
import io.github.melin.superior.common.antlr4.AntlrCaches.RELEASE_ANTLR_CACHE_AFTER_PARSING
import io.github.melin.superior.common.antlr4.ParseErrorListener
import io.github.melin.superior.common.antlr4.ParseException
import io.github.melin.superior.common.antlr4.UpperCaseCharStream
import io.github.melin.superior.common.relational.Statement
import io.github.melin.superior.parser.job.antlr4.AppJarLexer
import io.github.melin.superior.parser.job.antlr4.AppJarParser
import org.antlr.v4.runtime.CharStreams
import org.antlr.v4.runtime.CommonTokenStream
import org.antlr.v4.runtime.atn.PredictionMode
import org.antlr.v4.runtime.misc.ParseCancellationException
import org.apache.commons.lang3.StringUtils

/** Created by binsong.li on 2018/3/31 下午1:47 */
object AppJarHelper {

    @JvmStatic
    fun sqlKeywords(): List<String> {
        val keywords = hashSetOf<String>()
        (0 until AppJarLexer.VOCABULARY.maxTokenType).forEach { idx ->
            val name = AppJarLexer.VOCABULARY.getLiteralName(idx)
            if (name != null) {
                val matchResult = CommonUtils.KEYWORD_REGEX.find(name)
                if (matchResult != null) {
                    keywords.add(matchResult.groupValues.get(1))
                }
            }
        }

        return keywords.sorted()
    }

    @JvmStatic
    fun parseStatement(command: String): ArrayList<Statement> {
        val trimCmd = StringUtils.trim(command)

        val charStream = UpperCaseCharStream(CharStreams.fromString(trimCmd))
        val lexer = AppJarLexer(charStream)
        lexer.removeErrorListeners()
        lexer.addErrorListener(ParseErrorListener())

        val tokenStream = CommonTokenStream(lexer)
        val parser = AppJarParser(tokenStream)
        AbstractJarParser.installCaches(parser)
        parser.removeErrorListeners()
        parser.addErrorListener(ParseErrorListener())
        parser.interpreter.predictionMode = PredictionMode.SLL

        val cmdVisitor = AppJarAntlr4Visitor()
        cmdVisitor.setCommand(trimCmd)
        try {
            try {
                // first, try parsing with potentially faster SLL mode
                cmdVisitor.visit(parser.jobTasks())
                return cmdVisitor.getJobStmts()
            } catch (e: ParseCancellationException) {
                tokenStream.seek(0) // rewind input stream
                parser.reset()

                // Try Again.
                parser.interpreter.predictionMode = PredictionMode.LL
                cmdVisitor.visit(parser.jobTasks())
                return cmdVisitor.getJobStmts()
            }
        } catch (e: ParseException) {
            if (StringUtils.isNotBlank(e.command)) {
                throw e
            } else {
                throw e.withCommand(trimCmd)
            }
        } finally {
            val releaseAntlrCache = System.getenv(RELEASE_ANTLR_CACHE_AFTER_PARSING)
            if (releaseAntlrCache == null || "true".equals(releaseAntlrCache)) {
                AbstractJarParser.refreshParserCaches()
            }
        }
    }
}


================================================
FILE: superior-appjar-parser/src/main/kotlin/io/github/melin/superior/parser/appjar/AppJarInfo.kt
================================================
package io.github.melin.superior.parser.appjar

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

data class AppJarInfo(val resourceName: String, val className: String, val params: List<String>?) : Statement() {
    override val statementType = StatementType.APP_JAR
    override val privilegeType = PrivilegeType.OTHER
    override val sqlType = SqlType.DML
}


================================================
FILE: superior-appjar-parser/src/test/kotlin/io/github/melin/superior/parser/appjar/AppJarParserTest.kt
================================================
package io.github.melin.superior.parser.appjar

import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.common.ReSetStatement
import io.github.melin.superior.common.relational.common.SetStatement
import org.junit.Assert
import org.junit.Test

/** Created by binsong.li on 2018/3/31 下午1:59 */
class AppJarParserTest {

    @Test
    fun setConfigTest1() {
        val sql =
            """
            set flink.test = 'hello world';
            set flink.test = setsd,sd,resr;
            set flink.test = hello world;
            set flink.test = hello-world;
            set flink.test = hello $\{usename} test;
            #set flink.test = hello comment;
            set flink.test = hello 'test' world;
            set flink.test = hello "test" world;
            set flink.test = hdfs://user/hive;
            set flink.test = 12,12;
            set flink.test = 3.45;
            set flink.test = ibdex.json;
            reset flink.test;
            set flink.test = dw.eset_sdfe_sd;
            set flink.test = demo.test;
            set flink.test = dsd(id)%=2;
            tet_test-demo_1.23-sdfd.jar com.example.Demo1 param1  param2 'hello \n world'
             'hdfs://user/hive'
             '{"user": "binsong.li",
               address: "hangzhou"
             }'
             /user/jars/*
             --jars /user/jars/flink.jar
            """

        val statements = AppJarHelper.parseStatement(sql)
        Assert.assertEquals(16, statements.size)

        var statement = statements.get(0)
        if (statement is SetStatement) {
            Assert.assertEquals(StatementType.SET, statement.statementType)
            Assert.assertEquals("flink.test", statement.key)
            Assert.assertEquals("hello world", statement.value)
        } else {
            Assert.fail()
        }

        var setCount = 0
        statements.filter { it.statementType == StatementType.SET }.forEach { setCount = setCount + 1 }

        Assert.assertEquals(14, setCount)

        statement = statements.get(11)
        if (statement is ReSetStatement) {
            Assert.assertEquals(StatementType.RESET, statement.statementType)
            Assert.assertEquals("flink.test", statement.key)
        } else {
            Assert.fail()
        }

        statement = statements.get(15)
        if (statement is AppJarInfo) {
            Assert.assertEquals(StatementType.APP_JAR, statement.statementType)
            Assert.assertEquals("tet_test-demo_1.23-sdfd.jar", statement.resourceName)
            Assert.assertEquals("com.example.Demo1", statement.className)
            Assert.assertEquals(8, statement.params?.size)
            Assert.assertEquals("/user/jars/*", statement.params?.get(5))
        } else {
            Assert.fail()
        }
    }

    @Test
    fun setConfigTest2() {
        val sql = "demo.jar com.example.Demo 'hello \"test\" world' param2 \n param3"

        val statementDatas = AppJarHelper.parseStatement(sql)
        Assert.assertEquals(1, statementDatas.size)

        val statement = statementDatas.get(0)
        if (statement is AppJarInfo) {
            Assert.assertEquals(StatementType.APP_JAR, statement.statementType)
            Assert.assertEquals("demo.jar", statement.resourceName)
            Assert.assertEquals("com.example.Demo", statement.className)
            Assert.assertEquals(3, statement.params?.size)

            Assert.assertEquals("hello \"test\" world", statement.params?.get(0))
            Assert.assertEquals("param3", statement.params?.get(2))
        } else {
            Assert.fail()
        }
    }

    @Test
    fun setConfigTest3() {
        val sql =
            """
            set spark.yarn.queue=newoffline;
            set spark.sql.autoBroadcastJoinThreshold=40485760;
            set spark.executor.memory=8g;
            set spark.sql.hive.convertMetastoreParquet=true ;
            set spark.driver.maxResultSize=4g;
            set spark.driver.memory=10g;
            set spark.psi.ds=20180312;
            set spark.psi.dstTable=dw.index_psi_dt;
            set spark.psi.dims=idnumber;
            set spark.psi.num=0;
            set spark.psi.parNum=2;
            set spark.indexPSI.type=2;
            set spark.metrics.indexFile=index-mobile.json;
            psi_new_calculate_metrics-1.1-SNAPSHOT-jar-with-dependencies.jar  com.example.dw.psi.StartDCJob 1,3,sd,qw
            """

        val statementDatas = AppJarHelper.parseStatement(sql)
        Assert.assertEquals(14, statementDatas.size)

        val statement = statementDatas.get(13)
        if (statement is AppJarInfo) {
            Assert.assertEquals(StatementType.APP_JAR, statement.statementType)
            Assert.assertEquals(
                "psi_new_calculate_metrics-1.1-SNAPSHOT-jar-with-dependencies.jar",
                statement.resourceName
            )
            Assert.assertEquals("com.example.dw.psi.StartDCJob", statement.className)
            Assert.assertEquals("1,3,sd,qw", statement.params?.get(0))
        } else {
            Assert.fail()
        }
    }

    @Test
    fun setConfigTest4() {
        val sql =
            """
            set spark.yarn.queue=newoffline;
set spark.dynamicAllocation.maxExecutors=100;
set spark.driver.maxResultSize=30g;
set spark.driver.memory=15g;
set spark.executor.instances=80;
set spark.executor.cores=5;
set spark.executor.memory=30g;
set spark.sql.shuffle.partitions=5000;
set spark.shuffle.io.maxRetries=60;
set spark.shuffle.io.retryWait=60s;
set spark.metrics.indexFile=index-mobile.json;
set spark.metrics.indexInputTable=dw.dwa_mobile_model_dt;
set spark.metrics.indexOutputTable=dw.app_mdl_mobile_index_dt;
set spark.metrics.indexWaitFullPartition=true;
set spark.metrics.indexHashWhere=abs(hash(mobile))%4=3;
new_calculate_metrics-100-SNAPSHOT-jar-with-dependencies.jar com.example.dw.index.StartDCJob IndexOffline 2018-03-18
            """

        val statementDatas = AppJarHelper.parseStatement(sql)
        Assert.assertEquals(16, statementDatas.size)

        val statement = statementDatas.get(15)
        if (statement is AppJarInfo) {
            Assert.assertEquals(StatementType.APP_JAR, statement.statementType)
            Assert.assertEquals("new_calculate_metrics-100-SNAPSHOT-jar-with-dependencies.jar", statement.resourceName)
            Assert.assertEquals("com.example.dw.index.StartDCJob", statement.className)
            Assert.assertEquals("2018-03-18", statement.params?.get(1))
        } else {
            Assert.fail()
        }
    }

    @Test
    fun setConfigTest5() {
        val sql =
            """
            set spark.shuffle.compress=true;set spark.rdd.compress=true;
set spark.driver.maxResultSize=3g;
set spark.serializer=org.apache.spark.serializer.KryoSerializer;
set spark.kryoserializer.buffer.max=1024m;
set spark.kryoserializer.buffer=256m;
set spark.network.timeout=300s;
createHfile-1.2-SNAPSHOT-jar-with-dependencies.jar imei_test.euSaveHBase gaea_offline:account_mobile sh md shda.interest_radar_mobile_score_dt 20180318 /xiaoyong.fu/sh/mobile/loan 400 '%7B%22job_type%22=' --jar
            """

        val statementDatas = AppJarHelper.parseStatement(sql)
        Assert.assertEquals(8, statementDatas.size)

        val statement = statementDatas.get(7)
        if (statement is AppJarInfo) {
            Assert.assertEquals(StatementType.APP_JAR, statement.statementType)
            Assert.assertEquals("createHfile-1.2-SNAPSHOT-jar-with-dependencies.jar", statement.resourceName)
            Assert.assertEquals("imei_test.euSaveHBase", statement.className)
            Assert.assertEquals("/xiaoyong.fu/sh/mobile/loan", statement.params?.get(5))
            Assert.assertEquals("400", statement.params?.get(6))
            Assert.assertEquals("%7B%22job_type%22=", statement.params?.get(7))
            Assert.assertEquals("--jar", statement.params?.get(8))
        } else {
            Assert.fail()
        }
    }

    @Test
    fun setConfigTest6() {
        val sql =
            """
            set spark.toMysql.url=jdbc:mysql://192.168.40.110:3306/data_quality;set spark.toMysql.user=dq;
set spark.toMysql.password=0nlpSvpgC5leeKuw;
set spark.screenJob.screenType=3;
set spark.screenJob.test=true;
set spark.screenTool.srcTable=default.activity_flat;
set spark.toMysql.tableName=province;
set spark.toMysql.field=creditProvinceAmountJson,creditForeignAmount,creditCityAmountJson,zhejiangFraud,fraudProvinceAmountJson;
province-1.0-SNAPSHOT-jar-with-dependencies.jar com.example.screen_dc.ScreenJob /xiaoyong.fu/2017-22-03/sh/mobile/loan/ --write-private-test;
province-1.0-SNAPSHOT-jar-with-dependencies.jar com.example.screen_dc.ScreenJob /xiaoyong.fu/2017-22-03/sh/mobile/loan/ --write-private-test
            """

        val statementDatas = AppJarHelper.parseStatement(sql)
        Assert.assertEquals(10, statementDatas.size)

        val statement = statementDatas.get(9)
        if (statement is AppJarInfo) {
            Assert.assertEquals(StatementType.APP_JAR, statement.statementType)
            Assert.assertEquals("province-1.0-SNAPSHOT-jar-with-dependencies.jar", statement.resourceName)
            Assert.assertEquals("com.example.screen_dc.ScreenJob", statement.className)
            Assert.assertEquals("/xiaoyong.fu/2017-22-03/sh/mobile/loan/", statement.params?.get(0))
            Assert.assertEquals("--write-private-test", statement.params?.get(1))
        } else {
            Assert.fail()
        }
    }

    @Test
    fun setConfigTest7() {
        val sql =
            """
            raph.edgesSNAPSHOT.eventType.jar com.example.graph.PhoenixCSVWriterJob graph_csv_s_2 /user/datacompute/bigdata/data/shuoyi.zhao/graph_csv_s_2/2018/12/day_12
            /user/datacompute/bigdata/data/shuoyi.zhao/graph_csv_s_new_2/Loan/2018/12/day_12 500 Loan hdfs://192.168.40.37,hdfs://192.168.39.133 hdfs://192.168.40.37,hdfs://192.168.39.130;
            """

        val statementDatas = AppJarHelper.parseStatement(sql)
        Assert.assertEquals(1, statementDatas.size)

        val statement = statementDatas.get(0)
        if (statement is AppJarInfo) {
            Assert.assertEquals(StatementType.APP_JAR, statement.statementType)
            Assert.assertEquals("raph.edgesSNAPSHOT.eventType.jar", statement.resourceName)
            Assert.assertEquals("com.example.graph.PhoenixCSVWriterJob", statement.className)
            Assert.assertEquals("hdfs://192.168.40.37,hdfs://192.168.39.130", statement.params?.get(6))
        } else {
            Assert.fail()
        }
    }

    @Test
    fun setConfigTest8() {
        val sql =
            """
            set spark.app.name=sparkAppName;
            set spark.memory.storageFraction=0.1;
            set spark.memory.fraction=0.95;
            set spark.memory.useLegacyMode=true;
            set master=yarn-cluster;
            /user/pontus_2.1/pontus-core-2.1.0-SNAPSHOT-fat.jar com.example.pontus.core.Engine customCmd "-j{'readerFields':[{'field':'uuid','type':'string'},{'field':'rule_detail','type':'string'}],'resourceSetting':{'spark.driver.memory':'2g','spark.pontus.writer.mapper':'2'},'reader':{'databaseName':'afraudtech','connectionType':'hive','table':'antifraud_rule_result'},'writerFields':[{'transform':'uuid','field':'uuid','type':'varchar(32)'},{'filter':'where id=\'test\'','transform':'rule_detail','field':'policy_recommendation','type':'text'}],'writer':{'dataSourceId':'364','connectionAttr':'jdbc:mysql://192.168.74.136:3306/athena','password':'6ydJDezPBLBuco+sCV6QL6XsdTN/ShtYIz1Gi3TVusw=','writeMode':'UPSERT','userName':'athena','connectionType':'mysql','table':'edison_warning_result'}}"  --jars /user/pontus_2.1/*
            """

        val statementDatas = AppJarHelper.parseStatement(sql)
        Assert.assertEquals(6, statementDatas.size)

        val statement = statementDatas.get(5)
        if (statement is AppJarInfo) {
            Assert.assertEquals(StatementType.APP_JAR, statement.statementType)
            Assert.assertEquals("/user/pontus_2.1/pontus-core-2.1.0-SNAPSHOT-fat.jar", statement.resourceName)
            Assert.assertEquals("com.example.pontus.core.Engine", statement.className)
            Assert.assertEquals(4, statement.params?.size)
            val config =
                """
                -j{'readerFields':[{'field':'uuid','type':'string'},{'field':'rule_detail','type':'string'}],'resourceSetting':{'spark.driver.memory':'2g','spark.pontus.writer.mapper':'2'},'reader':{'databaseName':'afraudtech','connectionType':'hive','table':'antifraud_rule_result'},'writerFields':[{'transform':'uuid','field':'uuid','type':'varchar(32)'},{'filter':'where id=\'test\'','transform':'rule_detail','field':'policy_recommendation','type':'text'}],'writer':{'dataSourceId':'364','connectionAttr':'jdbc:mysql://192.168.74.136:3306/athena','password':'6ydJDezPBLBuco+sCV6QL6XsdTN/ShtYIz1Gi3TVusw=','writeMode':'UPSERT','userName':'athena','connectionType':'mysql','table':'edison_warning_result'}}
                """
            Assert.assertEquals(config.trim(), statement.params?.get(1))
        } else {
            Assert.fail()
        }
    }
}


================================================
FILE: superior-appjar-parser/src/test/resources/log4j2.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout
                    pattern="%style{%d{ISO8601}}{black} %highlight{%-5level }[%style{%t}{bright,blue}] %style{%C{1.}}{bright,yellow}: %msg%n%throwable" />
        </Console>
    </Appenders>

    <Loggers>
        <!-- LOG everything at INFO level -->
        <Root level="INFO">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

================================================
FILE: superior-arithmetic-parser/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>io.github.melin.superior</groupId>
        <artifactId>superior-sql-parser</artifactId>
        <version>4.0.23</version>
    </parent>

    <artifactId>superior-arithmetic-parser</artifactId>
    <name>superior-arithmetic-parser</name>

    <dependencies>
        <dependency>
            <groupId>io.github.melin.superior</groupId>
            <artifactId>superior-common-parser</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</project>


================================================
FILE: superior-arithmetic-parser/src/main/antlr4/io/github/melin/superior/parser/antlr4/arithmetic/Arithmetic.g4
================================================
grammar Arithmetic;

@members {
    public boolean bracket_enbled = true;
}

arithmetic: expression EOF;

expression
    : booleanExpression
    ;

booleanExpression
    : NOT booleanExpression                                        #logicalNot
    | valueExpression predicate?                                   #predicated
    | left=booleanExpression operator=AND right=booleanExpression  #logicalBinary
    | left=booleanExpression operator=OR right=booleanExpression   #logicalBinary
    ;

predicate
    : NOT? kind=BETWEEN lower=valueExpression AND upper=valueExpression
    | NOT? kind=IN '(' expression (',' expression)* ')'
    | NOT? kind=RLIKE pattern=valueExpression
    | NOT? kind=LIKE pattern=valueExpression (ESCAPE escapeChar=STRING)?
    | IS NOT? kind=NULL
    | IS NOT? kind=(TRUE | FALSE | UNKNOWN)
    ;

valueExpression
    : primaryExpression                                                                      #valueExpressionDefault
    | operator=(MINUS | PLUS | TILDE) valueExpression                                        #arithmeticUnary
    | left=valueExpression operator=(ASTERISK | SLASH | PERCENT | DIV) right=valueExpression #arithmeticBinary
    | left=valueExpression operator=(PLUS | MINUS | CONCAT_PIPE) right=valueExpression       #arithmeticBinary
    | left=valueExpression operator=AMPERSAND right=valueExpression                          #arithmeticBinary
    | left=valueExpression operator=HAT right=valueExpression                                #arithmeticBinary
    | left=valueExpression operator=PIPE right=valueExpression                               #arithmeticBinary
    | left=valueExpression comparisonOperator right=valueExpression                          #comparison
    ;

primaryExpression
    : CASE whenClause+ (ELSE elseExpression=expression)? END                                   #searchedCase
    | CASE value=expression whenClause+ (ELSE elseExpression=expression)? END                  #simpleCase
    | constant                                                                                 #constantDefault
    | functionName '(' (setQuantifier? argument+=expression (',' argument+=expression)*)? ')'  #functionCall
    | identifier '->' expression                                                               #lambda
    | '(' identifier (',' identifier)+ ')' '->' expression                                     #lambda
    | value=primaryExpression '[' index=valueExpression ']'                                    #subscript
    | identifier                                                                               #columnReference
    | '(' expression ')'                                                                       #parenthesizedExpression
    ;

comparisonOperator
    : EQ | NEQ | NEQJ | LT | LTE | GT | GTE | NSEQ
    ;

whenClause
    : WHEN condition=expression THEN result=expression
    ;

functionName
    : IDENTIFIER
    ;

identifier
    : {!bracket_enbled}? IDENTIFIER
    | {bracket_enbled}? LBRACKET IDENTIFIER RBRACKET
    ;

constant
    : NULL                                                                                     #nullLiteral
    | number                                                                                   #numericLiteral
    | booleanValue                                                                             #booleanLiteral
    | STRING+                                                                                  #stringLiteral
    ;

setQuantifier
    : DISTINCT
    | ALL
    ;

number
    : MINUS? INTEGER_VALUE            #integerLiteral
    | MINUS? BIGINT_LITERAL           #bigIntLiteral
    | MINUS? SMALLINT_LITERAL         #smallIntLiteral
    | MINUS? TINYINT_LITERAL          #tinyIntLiteral
    | MINUS? DOUBLE_LITERAL           #doubleLiteral
    | MINUS? BIGDECIMAL_LITERAL       #bigDecimalLiteral
    ;

booleanValue
    : TRUE | FALSE
    ;

STRING
    : '\'' ( ~('\''|'\\') | ('\\' .) )* '\''
    | '"' ( ~('"'|'\\') | ('\\' .) )* '"'
    ;

TRUE: 'TRUE';
FALSE: 'FALSE';
NULL: 'NULL';
CASE: 'CASE';
WHEN: 'WHEN';
THEN: 'THEN';
ELSE: 'ELSE';
END: 'END';
DISTINCT: 'DISTINCT';
ALL: 'ALL';

NOT: 'NOT';
AND: 'AND';
OR: 'OR';
BETWEEN: 'BETWEEN';
IN: 'IN';
RLIKE: 'RLIKE';
LIKE: 'LIKE';
IS: 'IS';
ESCAPE: 'ESCAPE';
UNKNOWN: 'UNKNOWN';

EQ  : '=' | '==';
NSEQ: '<=>';
NEQ : '<>';
NEQJ: '!=';
LT  : '<';
LTE : '<=';
GT  : '>';
GTE : '>=';
LBRACKET : '[' ;
RBRACKET : ']' ;

PLUS: '+';
MINUS: '-';
ASTERISK: '*';
SLASH: '/';
PERCENT: '%';
DIV: 'DIV';
TILDE: '~';
AMPERSAND: '&';
PIPE: '|';
CONCAT_PIPE: '||';
HAT: '^';

BIGINT_LITERAL
    : DIGIT+ 'L'
    ;

SMALLINT_LITERAL
    : DIGIT+ 'S'
    ;

TINYINT_LITERAL
    : DIGIT+ 'Y'
    ;

INTEGER_VALUE
    : DIGIT+
    ;

IDENTIFIER
    : (LETTER | DIGIT | '_')+
    ;

fragment EXPONENT
    : 'E' [+-]? DIGIT+
    ;

fragment DECIMAL_DIGITS
    : DIGIT+ '.' DIGIT*
    | '.' DIGIT+
    ;

DOUBLE_LITERAL
    : DIGIT+ EXPONENT? 'D'
    | DECIMAL_DIGITS EXPONENT? 'D'
    ;

BIGDECIMAL_LITERAL
    : DIGIT+ EXPONENT? 'BD'
    | DECIMAL_DIGITS EXPONENT? 'BD'
    ;

fragment DIGIT
    : [0-9]
    ;

fragment LETTER
    : [a-zA-Z]
    | ~[\u0000-\u007F\uD800-\uDBFF] // covers all characters above 0x7F which are not a surrogate
    | [\uD800-\uDBFF] [\uDC00-\uDFFF] // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF
    ;

SIMPLE_COMMENT
    : '--' ('\\\n' | ~[\r\n])* '\r'? '\n'? -> channel(HIDDEN)
    ;

BRACKETED_EMPTY_COMMENT
    : '/**/' -> channel(HIDDEN)
    ;

BRACKETED_COMMENT
    : '/*' ~[+] .*? '*/' -> channel(HIDDEN)
    ;

WS  : [ \r\n\t] + -> skip ;


================================================
FILE: superior-arithmetic-parser/src/main/kotlin/io/github/melin/superior/parser/arithmetic/AbstractArithParser.kt
================================================
package io.github.melin.superior.parser.arithmetic

import io.github.melin.superior.common.antlr4.AntlrCaches
import io.github.melin.superior.parser.antlr4.arithmetic.ArithmeticParser
import java.util.concurrent.atomic.AtomicReference

object AbstractArithParser {
    private val parserCaches = AtomicReference<AntlrCaches>(AntlrCaches(ArithmeticParser._ATN))

    /**
     * Install the parser caches into the given parser.
     *
     * This method should be called before parsing any input.
     */
    fun installCaches(parser: ArithmeticParser): Unit = parserCaches.get().installCaches(parser)

    /**
     * Drop the existing parser caches and create a new one.
     *
     * ANTLR retains caches in its parser that are never released. This speeds up parsing of future input, but it can
     * consume a lot of memory depending on the input seen so far.
     *
     * This method provides a mechanism to free the retained caches, which can be useful after parsing very large SQL
     * inputs, especially if those large inputs are unlikely to be similar to future inputs seen by the driver.
     */
    fun refreshParserCaches() {
        parserCaches.set(AntlrCaches(ArithmeticParser._ATN))
    }
}


================================================
FILE: superior-arithmetic-parser/src/main/kotlin/io/github/melin/superior/parser/arithmetic/ArithmeticAntlr4Visitor.kt
================================================
package com.github.melin.superior.sql.parser.arithmetic

import io.github.melin.superior.common.SQLParserException
import io.github.melin.superior.common.relational.Statement
import io.github.melin.superior.parser.antlr4.arithmetic.ArithmeticBaseVisitor
import io.github.melin.superior.parser.antlr4.arithmetic.ArithmeticParser
import io.github.melin.superior.parser.arithmetic.ArithmeticData
import org.antlr.v4.runtime.tree.ParseTree
import org.apache.commons.lang3.StringUtils

/** Created by libinsong on 2020/7/28 9:49 上午 */
class ArithmeticAntlr4Visitor(val bracketEnbled: Boolean) : ArithmeticBaseVisitor<Statement>() {

    private var statement: Statement? = null

    private val arithmetic = ArithmeticData()

    override fun visit(tree: ParseTree): Statement? {
        super.visit(tree)

        if (statement == null) {
            throw SQLParserException("不支持的表达式")
        }

        return statement
    }

    override fun visitExpression(ctx: ArithmeticParser.ExpressionContext): Statement? {
        statement = arithmetic
        return super.visitExpression(ctx)
    }

    override fun visitIdentifier(ctx: ArithmeticParser.IdentifierContext): Statement? {
        val name = ctx.text
        if (!arithmetic.functions.contains(name)) {
            if (bracketEnbled) {
                arithmetic.variables.add(StringUtils.substringBetween(name, "[", "]"))
            } else {
                arithmetic.variables.add(name)
            }
        }
        return super.visitIdentifier(ctx)
    }

    override fun visitFunctionName(ctx: ArithmeticParser.FunctionNameContext): Statement? {
        val name = ctx.text
        arithmetic.functions.add(name)
        return super.visitFunctionName(ctx)
    }
}


================================================
FILE: superior-arithmetic-parser/src/main/kotlin/io/github/melin/superior/parser/arithmetic/ArithmeticHelper.kt
================================================
package com.github.melin.superior.sql.parser.arithmetic

import io.github.melin.superior.common.antlr4.AntlrCaches
import io.github.melin.superior.common.antlr4.ParseException
import io.github.melin.superior.common.relational.Statement
import io.github.melin.superior.parser.antlr4.arithmetic.ArithmeticLexer
import io.github.melin.superior.parser.antlr4.arithmetic.ArithmeticParser
import io.github.melin.superior.parser.arithmetic.AbstractArithParser
import org.antlr.v4.runtime.CharStreams
import org.antlr.v4.runtime.CommonTokenStream
import org.antlr.v4.runtime.atn.PredictionMode
import org.antlr.v4.runtime.misc.ParseCancellationException
import org.apache.commons.lang3.StringUtils

/** Created by libinsong on 2018/1/10. */
object ArithmeticHelper {

    @JvmStatic
    fun parseStatement(command: String): Statement? {
        return ArithmeticHelper.parseStatement(command, true)
    }

    @JvmStatic
    fun parseStatement(command: String, bracketEnbled: Boolean): Statement? {
        val trimCmd = StringUtils.trim(command)

        val charStream = CharStreams.fromString(trimCmd)
        val lexer = ArithmeticLexer(charStream)

        val tokenStream = CommonTokenStream(lexer)
        val parser = ArithmeticParser(tokenStream)
        AbstractArithParser.installCaches(parser)
        parser.bracket_enbled = bracketEnbled
        parser.interpreter.predictionMode = PredictionMode.SLL

        val sqlVisitor = ArithmeticAntlr4Visitor(bracketEnbled)

        try {
            try {
                // first, try parsing with potentially faster SLL mode
                return sqlVisitor.visit(parser.expression())
            } catch (e: ParseCancellationException) {
                tokenStream.seek(0) // rewind input stream
                parser.reset()

                // Try Again.
                parser.interpreter.predictionMode = PredictionMode.LL
                return sqlVisitor.visit(parser.expression())
            }
        } catch (e: ParseException) {
            if (StringUtils.isNotBlank(e.command)) {
                throw e
            } else {
                throw e.withCommand(trimCmd)
            }
        } finally {
            val releaseAntlrCache = System.getenv(AntlrCaches.RELEASE_ANTLR_CACHE_AFTER_PARSING)
            if (releaseAntlrCache == null || "true".equals(releaseAntlrCache)) {
                AbstractArithParser.refreshParserCaches()
            }
        }
    }
}


================================================
FILE: superior-arithmetic-parser/src/main/kotlin/io/github/melin/superior/parser/arithmetic/Data.kt
================================================
package io.github.melin.superior.parser.arithmetic

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

data class ArithmeticData(
    val variables: java.util.HashSet<String> = HashSet(),
    val functions: java.util.HashSet<String> = HashSet()
) : Statement() {
    override val statementType = StatementType.ARITHMETIC
    override val privilegeType = PrivilegeType.OTHER
    override val sqlType = SqlType.DML
}


================================================
FILE: superior-arithmetic-parser/src/test/kotlin/io/github/melin/superior/parser/arithmetic/ArithmetricParserTest.kt
================================================
package io.github.melin.superior.parser.arithmetic

import com.github.melin.superior.sql.parser.arithmetic.ArithmeticHelper
import io.github.melin.superior.common.StatementType
import org.junit.Assert
import org.junit.Test

/** Created by libinsong on 2018/1/10. */
class ArithmetricParserTest {

    @Test
    fun test0() {
        val sql = """
            特征1 / (特征_dd_2
                - (log2(feature_12) + 特征3))
            """

        val statement = ArithmeticHelper.parseStatement(sql, false)
        Assert.assertEquals(StatementType.ARITHMETIC, statement?.statementType)
        if (statement is ArithmeticData) {
            Assert.assertEquals(4, statement.variables.toArray().size)
            Assert.assertEquals(1, statement.functions.size)
            Assert.assertEquals("log2", statement.functions.toArray().get(0))
        } else {
            Assert.fail()
        }
    }

    @Test
    fun test1() {
        val sql =
            """
            case when rand <= 12 then 1
                                when rand <= 23 then 2
                                else 3 end
            """

        val statement = ArithmeticHelper.parseStatement(sql, false)
        Assert.assertEquals(StatementType.ARITHMETIC, statement?.statementType)
        if (statement is ArithmeticData) {
            Assert.assertEquals(1, statement.variables.toArray().size)
            Assert.assertEquals(0, statement.functions.size)
        } else {
            Assert.fail()
        }
    }

    @Test
    fun test2() {
        val sql = """
            [特征1] / ([特征_dd_2]
                - (log2([feature_12]) + [特征3]))
            """

        val statement = ArithmeticHelper.parseStatement(sql)
        Assert.assertEquals(StatementType.ARITHMETIC, statement?.statementType)
        if (statement is ArithmeticData) {
            Assert.assertEquals(4, statement.variables.toArray().size)
            Assert.assertEquals(1, statement.functions.size)
            Assert.assertEquals("log2", statement.functions.toArray().get(0))
        } else {
            Assert.fail()
        }
    }
}


================================================
FILE: superior-arithmetic-parser/src/test/resources/log4j2.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout
                    pattern="%style{%d{ISO8601}}{black} %highlight{%-5level }[%style{%t}{bright,blue}] %style{%C{1.}}{bright,yellow}: %msg%n%throwable" />
        </Console>
    </Appenders>

    <Loggers>
        <!-- LOG everything at INFO level -->
        <Root level="INFO">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

================================================
FILE: superior-common-parser/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>io.github.melin.superior</groupId>
        <artifactId>superior-sql-parser</artifactId>
        <version>4.0.23</version>
    </parent>

    <artifactId>superior-common-parser</artifactId>
    <name>superior-common-parser</name>

</project>


================================================
FILE: superior-common-parser/src/main/java/io/github/melin/superior/common/antlr4/AntlrCaches.java
================================================
package io.github.melin.superior.common.antlr4;

import org.antlr.v4.runtime.Parser;
import org.antlr.v4.runtime.atn.ATN;
import org.antlr.v4.runtime.atn.ParserATNSimulator;
import org.antlr.v4.runtime.atn.PredictionContextCache;
import org.antlr.v4.runtime.dfa.DFA;

public class AntlrCaches {

    public static final String RELEASE_ANTLR_CACHE_AFTER_PARSING = "releaseAntlrCacheAfterParsing";

    private final ATN atn;

    private final PredictionContextCache predictionContextCache = new PredictionContextCache();

    private final DFA[] decisionToDFA;

    public AntlrCaches(ATN atn) {
        this.atn = atn;
        this.decisionToDFA = makeDecisionToDFA(this.atn);
    }

    public void installCaches(Parser parser) {
        parser.setInterpreter(new ParserATNSimulator(parser, atn, decisionToDFA, predictionContextCache));
    }

    private DFA[] makeDecisionToDFA(ATN atn) {
        DFA[] decisionToDFA = new DFA[atn.getNumberOfDecisions()];
        for (int i = 0, len = atn.getNumberOfDecisions(); i < len; i++) {
            decisionToDFA[i] = new DFA(atn.getDecisionState(i), i);
        }
        return decisionToDFA;
    }
}


================================================
FILE: superior-common-parser/src/main/java/io/github/melin/superior/common/antlr4/Origin.java
================================================
package io.github.melin.superior.common.antlr4;

public class Origin {
    private int line;
    private int startPosition;

    public Origin(int line, int startPosition) {
        this.line = line;
        this.startPosition = startPosition;
    }

    public int getLine() {
        return line;
    }

    public void setLine(int line) {
        this.line = line;
    }

    public int getStartPosition() {
        return startPosition;
    }

    public void setStartPosition(int startPosition) {
        this.startPosition = startPosition;
    }
}


================================================
FILE: superior-common-parser/src/main/java/io/github/melin/superior/common/antlr4/ParseErrorListener.java
================================================
package io.github.melin.superior.common.antlr4;

import org.antlr.v4.runtime.BaseErrorListener;
import org.antlr.v4.runtime.RecognitionException;
import org.antlr.v4.runtime.Recognizer;

public class ParseErrorListener extends BaseErrorListener {

    @Override
    public void syntaxError(
            Recognizer<?, ?> recognizer,
            Object offendingSymbol,
            int line,
            int charPositionInLine,
            java.lang.String msg,
            RecognitionException e) {
        Origin position = new Origin(line, charPositionInLine);
        throw new ParseException(msg, position, position);
    }
}


================================================
FILE: superior-common-parser/src/main/java/io/github/melin/superior/common/antlr4/ParseException.java
================================================
package io.github.melin.superior.common.antlr4;

import org.apache.commons.lang3.StringUtils;

public class ParseException extends RuntimeException {
    private String command;
    private String message;
    private Origin start;
    private Origin stop;

    public ParseException(String message, Origin start, Origin stop) {
        this.message = message;
        this.start = start;
        this.stop = stop;
    }

    public ParseException(String command, String message, Origin start, Origin stop) {
        this.command = command;
        this.message = message;
        this.start = start;
        this.stop = stop;
    }

    @Override
    public String getMessage() {
        StringBuilder builder = new StringBuilder();
        builder.append("\n").append(message);
        if (start != null) {
            builder.append("(line " + start.getLine() + ", pos " + start.getStartPosition() + ")\n");
            if (StringUtils.isNotBlank(command)) {
                String[] lines = command.split("\n");
                builder.append("\n== SQL ==\n");
                for (int i = 0; i < start.getLine(); i++) {
                    builder.append(lines[i]).append("\n");
                }

                for (int i = 0; i < start.getStartPosition(); i++) {
                    builder.append("-");
                }
                builder.append("^^^\n");

                for (int i = start.getLine(); i < lines.length; i++) {
                    builder.append(lines[i]).append("\n");
                }
            }
        } else {
            builder.append("\n== SQL ==\n").append(command);
        }

        return StringUtils.trim(builder.toString());
    }

    public ParseException withCommand(String cmd) {
        return new ParseException(cmd, message, start, stop);
    }

    public String getCommand() {
        return command;
    }

    public Origin getStart() {
        return start;
    }

    public Origin getStop() {
        return stop;
    }
}


================================================
FILE: superior-common-parser/src/main/java/io/github/melin/superior/common/antlr4/ParserUtils.java
================================================
package io.github.melin.superior.common.antlr4;

import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.misc.Interval;
import org.antlr.v4.runtime.tree.TerminalNode;

public class ParserUtils {

    /** Get the code that creates the given node. */
    public static String source(ParserRuleContext ctx) {
        CharStream stream = ctx.getStart().getInputStream();
        return stream.getText(
                Interval.of(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex()));
    }

    public static String getString(Token token) {
        return unescapeSQLString(token.getText());
    }

    public static String getString(TerminalNode token) {
        return unescapeSQLString(token.getText());
    }

    public static int getInt(Token token) {
        return Integer.parseInt(token.getText());
    }

    public static String command(ParserRuleContext ctx) {
        CharStream stream = ctx.getStart().getInputStream();
        return stream.getText(Interval.of(0, stream.size()));
    }

    public static Origin position(Token token) {
        return new Origin(token.getLine(), token.getCharPositionInLine());
    }

    private static void appendEscapedChar(StringBuilder sb, char n) {
        switch (n) {
            case '0':
                sb.append("\u0000");
            case '\'':
                sb.append("\'");
            case '"':
                sb.append("\"");
            case 'b':
                sb.append("\b");
            case 'n':
                sb.append("\n");
            case 'r':
                sb.append("\r");
            case 't':
                sb.append("\t");
            case 'Z':
                sb.append("\u001A");
            case '\\':
                sb.append("\\");
                // The following 2 lines are exactly what MySQL does TODO: why do we do this?
            case '%':
                sb.append("\\%");
            case '_':
                sb.append("\\_");
            default:
                sb.append(n);
        }
    }

    private static String unescapeSQLString(String b) {
        Character enclosure = null;
        StringBuilder sb = new StringBuilder(b.length());

        int i = 0;
        int strLength = b.length();
        while (i < strLength) {
            char currentChar = b.charAt(i);
            if (enclosure == null) {
                if (currentChar == '\'' || currentChar == '\"') {
                    enclosure = currentChar;
                }
            } else if (enclosure == currentChar) {
                enclosure = null;
            } else if (currentChar == '\\') {

                if ((i + 6 < strLength) && b.charAt(i + 1) == 'u') {
                    // \u0000 style character literals.

                    int code = 0;
                    int base = i + 2;
                    for (int h = 0; h < 4; h++) {
                        int digit = Character.digit(b.charAt(h + base), 16);
                        code = (code << 4) + digit;
                    }
                    sb.append((char) code);
                    i += 5;
                } else if (i + 4 < strLength) {
                    // \000 style character literals.

                    char i1 = b.charAt(i + 1);
                    char i2 = b.charAt(i + 2);
                    char i3 = b.charAt(i + 3);

                    if ((i1 >= '0' && i1 <= '1') && (i2 >= '0' && i2 <= '7') && (i3 >= '0' && i3 <= '7')) {
                        char tmp = (char) ((i3 - '0') + ((i2 - '0') << 3) + ((i1 - '0') << 6));
                        sb.append(tmp);
                        i += 3;
                    } else {
                        appendEscapedChar(sb, i1);
                        i += 1;
                    }
                } else if (i + 2 < strLength) {
                    // escaped character literals.
                    char n = b.charAt(i + 1);
                    appendEscapedChar(sb, n);
                    i += 1;
                }
            } else {
                // non-escaped character literals.
                sb.append(currentChar);
            }
            i += 1;
        }
        return sb.toString();
    }
}


================================================
FILE: superior-common-parser/src/main/java/io/github/melin/superior/common/antlr4/UpperCaseCharStream.java
================================================
package io.github.melin.superior.common.antlr4;

import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CodePointCharStream;
import org.antlr.v4.runtime.IntStream;
import org.antlr.v4.runtime.misc.Interval;

public class UpperCaseCharStream implements CharStream {

    private CodePointCharStream wrapped;

    public UpperCaseCharStream(CodePointCharStream wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public void consume() {
        wrapped.consume();
    }

    @Override
    public int LA(int i) {
        int la = wrapped.LA(i);
        if (la == 0 || la == IntStream.EOF) {
            return la;
        } else {
            return Character.toUpperCase(la);
        }
    }

    @Override
    public String getText(Interval interval) {
        if (size() > 0 && (interval.b - interval.a >= 0)) {
            return wrapped.getText(interval);
        } else {
            return "";
        }
    }

    @Override
    public int mark() {
        return wrapped.mark();
    }

    @Override
    public void release(int i) {
        wrapped.release(i);
    }

    @Override
    public int index() {
        return wrapped.index();
    }

    @Override
    public void seek(int i) {
        wrapped.seek(i);
    }

    @Override
    public int size() {
        return wrapped.size();
    }

    @Override
    public String getSourceName() {
        return wrapped.getSourceName();
    }
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/AlterActionType.kt
================================================
package io.github.melin.superior.common

import java.io.Serializable

enum class AlterActionType : Serializable {
    SET_PROPS,
    SET_SERDE,
    TOUCH_TABLE,
    ALTER_COLUMN,
    ALTER_VIEW_QUERY,
    ADD_UNIQUE_KEY,
    ADD_PRIMARY_KEY,
    ADD_INDEX,
    ADD_PARTITION,
    DROP_INDEX,
    ADD_COLUMN,
    SET_COLUMN_DEFAULT,
    DROP_COLUMN,
    DROP_COLUMN_DRFAULT,
    DROP_PARTITION,
    DROP_PRIMARY_KEY,
    RENAME,
    RENAME_PARTITION,
    DETACH_PARTITION,
    ATTACH_PARTITION,
    TRUNCATE_PARTITION,
    REFRESH_MV,

    // Iceberg SQL Extensions
    CREATE_TAG,
    CREATE_BRANCH,
    DROP_TAG,
    DROP_BRANCH,
    ADD_PARTITION_FIELD,
    DROP_PARTITION_FIELD,
    REPLACE_PARTITION_FIELD,
    SET_WRITE_DISTRIBUTION_AND_ORDERING,
    SET_IDENTIFIER_FIELDS,
    DROP_IDENTIFIER_FIELDS,

    // delta
    ADD_CONSTRAINT,
    DROP_CONSTRAINT,
    DROP_FEATURE,
    CLUSTER_BY,
    SYNC_IDENTITY,
    UNKOWN
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/PrivilegeType.kt
================================================
package io.github.melin.superior.common

enum class PrivilegeType {
    READ,
    WRITE,
    ALTER,
    DROP,
    ADMIN,
    CREATE,
    PROCEDURE,
    OTHER,
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/SQLParserException.kt
================================================
package io.github.melin.superior.common

class SQLParserException : RuntimeException {
    constructor(message: String, ex: Exception?) : super(message, ex) {}

    constructor(message: String) : super(message) {}

    constructor(ex: Exception) : super(ex) {}
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/SqlType.kt
================================================
package io.github.melin.superior.common

enum class SqlType(val desc: String) {
    DML("Data Manipulation Language"),
    DDL("Data Definition Language"),
    DQL("Data Query Language"),
    DCL("Data Control Language"),
    TCL("Transaction Control Language")
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/StatementType.kt
================================================
package io.github.melin.superior.common

import java.io.Serializable

/** Created by libinsong on 2017/3/6. */
enum class StatementType : Serializable {
    CREATE_CATALOG,
    CREATE_DATABASE,
    CREATE_SCHEMA,
    CREATE_TABLE,
    CREATE_TABLE_AS_SELECT,
    CREATE_TABLE_AS_LIKE,
    CREATE_MATERIALIZED_VIEW,
    CREATE_VIEW,
    CREATE_FILE_VIEW, // spark
    CREATE_TEMP_VIEW_USING, // spark
    CREATE_FUNCTION,
    CREATE_PROCEDURE,
    DROP_CATALOG,
    DROP_DATABASE,
    DROP_SCHEMA,
    DROP_TABLE,
    DROP_VIEW,
    DROP_MATERIALIZED_VIEW,
    DROP_FUNCTION,
    DROP_SEQUENCE,
    DROP_PROCEDURE,
    TRUNCATE_TABLE,
    REFRESH_TABLE,
    EXPORT_TABLE,
    CANCEL_EXPORT,
    ANALYZE_TABLE,
    ALTER_DATABASE,
    ALTER_VIEW,
    ALTER_MATERIALIZED_VIEW,
    ALTER_TABLE,
    REPAIR_TABLE,
    COMMENT,

    // DML
    SELECT,
    DELETE,
    UPDATE,
    MERGE,
    INSERT,
    LOAD_DATA, // spark
    SHOW,
    DESC,

    // spark
    CACHE,
    UNCACHE,
    CLEAR_CACHE,

    // spark delta
    VACUUM_TABLE,
    OPTIMIZE_TABLE,
    DESC_DELTA_DETAIL,
    DESC_DELTA_HISTORY,

    // spark
    DESC_FUNCTION,
    DESC_CATALOG,
    DESC_DATABASE,
    DESC_SCHEMA,
    DESC_TABLE,
    DESC_QUERY,

    //
    REFRESH_MV,
    CANCEL_REFRESH_MV,
    EXPLAIN,
    SET,
    RESET,
    USE,
    SPARK_DIST_CP,
    DATATUNNEL, // spark
    MERGE_FILE, // spark
    APP_JAR, // spark
    CALL, // hudi
    HELP, // hudi
    ARITHMETIC,

    // StarRocks
    SR_SUBMIT_TASK,
    SR_DROP_TASK,
    SR_CREATE_ROUTINE_LOAD,
    SR_PAUSE_ROUTINE_LOAD,
    SR_RESUME_ROUTINE_LOAD,
    SR_STOP_ROUTINE_LOAD,
    SR_ALTER_ROUTINE_LOAD,
    LOAD_TABLE,
    CANCEL_LOAD_TABLE,
    ALTER_LOAD_TABLE,
    ADD_RESOURCE,
    LIST_RESOURCE,
    REMOVE_RESOURCE,
    SYNC_META,
    SYNC_TABLE,
    SYNC_DATABASE,
    UNKOWN
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/TableType.kt
================================================
package io.github.melin.superior.common

enum class TableType {
    HIVE,
    MYSQL,
    ORACLE,
    STARROCKS,
    POSTGRES,
    SQLSERVER,
    FLINK,
    SPARK_STREAM,
    DAMENG,
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/AnalyzeTable.kt
================================================
package io.github.melin.superior.common.relational

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType

data class AnalyzeTable(val tableIds: List<TableId>) : Statement() {
    override val statementType = StatementType.ANALYZE_TABLE
    override val privilegeType = PrivilegeType.READ
    override val sqlType = SqlType.DML
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/DefaultStatement.kt
================================================
package io.github.melin.superior.common.relational

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType

class DefaultStatement(override val statementType: StatementType) : Statement() {
    override val privilegeType = PrivilegeType.OTHER
    override val sqlType = SqlType.DML
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/FunctionId.kt
================================================
package io.github.melin.superior.common.relational

import com.google.common.collect.Lists
import org.apache.commons.lang3.StringUtils

data class FunctionId(
    val catalogName: String?,
    val schemaName: String?,
    val functionName: String,
) {

    companion object {
        @JvmStatic fun of(functionName: String) = TableId(functionName)

        @JvmStatic fun of(schemaName: String, functionName: String) = TableId(schemaName, functionName)

        @JvmStatic
        fun of(catalogName: String, schemaName: String, functionName: String) =
            TableId(catalogName, schemaName, functionName)
    }

    var funcType: String = "CF" // callfunction & TVF
    var functionArguments: List<String> = Lists.newArrayList()

    constructor(schemaName: String?, tableName: String) : this(null, schemaName, tableName)

    constructor(tableName: String) : this(null, null, tableName)

    fun getFullFunctionName(): String {
        if (catalogName != null) {
            return "$catalogName.$schemaName.$functionName"
        }

        if (schemaName != null) {
            return "$schemaName.$functionName"
        }

        return functionName
    }

    fun getLowerCatalogName(): String {
        return StringUtils.lowerCase(catalogName)
    }

    fun getLowerSchemaName(): String {
        return StringUtils.lowerCase(schemaName)
    }

    fun getLowerTableName(): String {
        return StringUtils.lowerCase(functionName)
    }
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/ProcedureId.kt
================================================
package io.github.melin.superior.common.relational

import org.apache.commons.lang3.StringUtils

data class ProcedureId(val catalogName: String?, val schemaName: String?, val procedureName: String) {

    constructor(schemaName: String?, procedureName: String) : this(null, schemaName, procedureName)

    constructor(procedureName: String) : this(null, null, procedureName)

    fun getFullFunctionName(): String {
        if (catalogName != null) {
            return "${catalogName}.${schemaName}.${procedureName}"
        }

        if (schemaName != null) {
            return "${schemaName}.${procedureName}"
        }

        return procedureName
    }

    fun getLowerCatalogName(): String {
        return StringUtils.lowerCase(catalogName)
    }

    fun getLowerSchemaName(): String {
        return StringUtils.lowerCase(schemaName)
    }

    fun getLowerTableName(): String {
        return StringUtils.lowerCase(procedureName)
    }
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/SchemaId.kt
================================================
package io.github.melin.superior.common.relational

import org.apache.commons.lang3.StringUtils

data class SchemaId(val catalogName: String?, val schemaName: String) {

    companion object {
        @JvmStatic fun of(schemaName: String) = SchemaId(schemaName)

        @JvmStatic fun of(catalogName: String, schemaName: String) = SchemaId(catalogName, schemaName)
    }

    constructor(schemaName: String) : this(null, schemaName)

    fun getFullSchemaName(): String {
        if (catalogName != null) {
            return "${catalogName}.${schemaName}"
        }

        return schemaName
    }

    fun getLowerCatalogName(): String {
        return StringUtils.lowerCase(catalogName)
    }

    fun getLowerSchemaName(): String {
        return StringUtils.lowerCase(schemaName)
    }
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/Statement.kt
================================================
package io.github.melin.superior.common.relational

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import org.apache.commons.lang3.StringUtils
import java.io.Serializable

abstract class Statement : Serializable {
    abstract val statementType: StatementType
    abstract val privilegeType: PrivilegeType
    abstract val sqlType: SqlType
    private var sql: String = ""

    fun setSql(sql: String) {
        if (StringUtils.endsWith(sql, ";")) {
            this.sql = StringUtils.substringBeforeLast(sql, ";")
        } else {
            this.sql = sql
        }
    }

    fun getSql(): String {
        return this.sql
    }
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/TableId.kt
================================================
package io.github.melin.superior.common.relational

import org.apache.commons.lang3.StringUtils

data class TableId(val catalogName: String?, val schemaName: String?, val tableName: String, val metaType: String?) {

    companion object {
        @JvmStatic fun of(tableName: String) = TableId(tableName)

        @JvmStatic fun of(schemaName: String, tableName: String) = TableId(schemaName, tableName)

        @JvmStatic
        fun of(catalogName: String, schemaName: String, tableName: String) = TableId(catalogName, schemaName, tableName)
    }

    constructor(
        catalogName: String?,
        schemaName: String?,
        tableName: String
    ) : this(catalogName, schemaName, tableName, null)

    constructor(schemaName: String?, tableName: String) : this(null, schemaName, tableName, null)

    constructor(tableName: String) : this(null, null, tableName, null)

    fun getFullTableName(): String {
        if (catalogName != null) {
            return "${catalogName}.${schemaName}.${tableName}"
        }

        if (schemaName != null) {
            return "${schemaName}.${tableName}"
        }

        return tableName
    }

    fun getLowerCatalogName(): String {
        return StringUtils.lowerCase(catalogName)
    }

    fun getLowerSchemaName(): String {
        return StringUtils.lowerCase(schemaName)
    }

    fun getLowerTableName(): String {
        return StringUtils.lowerCase(tableName)
    }
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/abs/AbsDatabaseStatement.kt
================================================
package io.github.melin.superior.common.relational.abs

import io.github.melin.superior.common.relational.Statement

abstract class AbsDatabaseStatement : Statement() {
    abstract val databaseName: String
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/abs/AbsTableStatement.kt
================================================
package io.github.melin.superior.common.relational.abs

import io.github.melin.superior.common.relational.Statement
import io.github.melin.superior.common.relational.TableId

abstract class AbsTableStatement : Statement() {
    abstract val tableId: TableId
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/alter/AlterAction.kt
================================================
package io.github.melin.superior.common.relational.alter

import io.github.melin.superior.common.AlterActionType
import io.github.melin.superior.common.PrivilegeType

abstract class AlterAction(val privilegeType: PrivilegeType = PrivilegeType.ALTER) {
    abstract val alterType: AlterActionType
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/alter/AlterActions.kt
================================================
package io.github.melin.superior.common.relational.alter

import com.google.common.collect.Maps
import io.github.melin.superior.common.AlterActionType
import io.github.melin.superior.common.relational.SortType
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.dml.QueryStmt
import io.github.melin.superior.common.relational.table.ColumnRel
import java.util.HashMap

data class AlterTableAction(override var alterType: AlterActionType) : AlterAction()

data class AlterPropsAction(var location: String? = null, var properties: HashMap<String, String> = Maps.newHashMap()) :
    AlterAction() {
    override var alterType: AlterActionType = AlterActionType.SET_PROPS

    constructor(properties: HashMap<String, String>) : this(null, properties)
}

data class AlterSerDeAction(var properties: HashMap<String, String> = Maps.newHashMap()) : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.SET_SERDE
}

data class RenameAction(var newTableId: TableId, var ifExists: Boolean = false) : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.RENAME
}

data class AlterTouchPartitionAction(
    val newTableId: TableId, // 修改表,新列名称
    val partitionVals: LinkedHashMap<String, String>?
) : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.TOUCH_TABLE
}

data class AlterViewAction(
    val queryStmt: QueryStmt // 修改表,新列名称
) : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.ALTER_VIEW_QUERY
}

data class RefreshMvAction(var async: Boolean = false) : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.REFRESH_MV
}

data class AlterColumnAction(
    override var alterType: AlterActionType,
    var columName: String? = null, // 修改列名
    var dataType: String? = null,
    var comment: String? = null,
    var position: String? = null,
    var afterCol: String? = null,
    var setOrDrop: String? = null,
    var nullable: Boolean = true,
    var defaultExpression: String? = null,
    var dropDefault: Boolean = false,
    var ifNotExists: Boolean = false
) : AlterAction() {
    var newColumName: String? = null // 修改列名,新列名称

    fun getColumn(): ColumnRel? {
        return if (columName != null) {
            ColumnRel(columName!!, dataType, comment, nullable, defaultExpression)
        } else {
            null
        }
    }
}

data class DropColumnAction(var columNames: ArrayList<String> = arrayListOf()) : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.DROP_COLUMN

    fun firstColumn(): String {
        return columNames.first()
    }

    constructor(columName: String) : this(arrayListOf(columName))
}

data class AddPartitionAction(var ifNotExists: Boolean = false, var partitions: List<LinkedHashMap<String, String>>) :
    AlterAction() {
    override var alterType: AlterActionType = AlterActionType.ADD_PARTITION
}

data class DropPartitionAction(
    var ifExists: Boolean = false,
    var partitions: List<LinkedHashMap<String, String>> = listOf()
) : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.DROP_PARTITION
}

data class RenamePartitionAction(
    var fromPartitionVals: LinkedHashMap<String, String>,
    var toPartitionVals: LinkedHashMap<String, String>
) : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.RENAME_PARTITION
}

data class CreateIndex(val indexName: String, val indexColumnNames: ArrayList<IndexColumnName> = arrayListOf()) :
    AlterAction() {
    override var alterType: AlterActionType = AlterActionType.ADD_INDEX
    var intimeAction: String = "ONLINE" // mysql ONLINE & OFFLINE
    var indexCategory: String? = null
    var indexType: String? = null
    var comment: String? = null
}

data class IndexColumnName(
    val columnName: String,
    val sortType: SortType = SortType.UNKOWN,
)

data class DropIndex(val indexName: String, var ifExists: Boolean = false) : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.DROP_INDEX
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/alter/AlterDatabase.kt
================================================
package io.github.melin.superior.common.relational.alter

import io.github.melin.superior.common.*
import io.github.melin.superior.common.relational.abs.AbsDatabaseStatement
import kotlin.collections.ArrayList

data class AlterDatabase(
    val alterActionType: AlterActionType,
    override val databaseName: String,
    private val action: AlterAction?
) : AbsDatabaseStatement() {
    override val statementType = StatementType.ALTER_DATABASE
    override val privilegeType = PrivilegeType.ALTER
    override val sqlType = SqlType.DDL

    val actions: ArrayList<AlterAction> = ArrayList()
    var ifExists: Boolean = false

    init {
        if (action != null) {
            actions.add(action)
        }
    }

    constructor(alterActionType: AlterActionType, databaseName: String) : this(alterActionType, databaseName, null)

    fun addActions(list: List<AlterAction>) {
        actions.addAll(list)
    }

    fun firstAction(): AlterAction {
        return actions.first()
    }
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/alter/AlterDatabaseActions.kt
================================================
package io.github.melin.superior.common.relational.alter

import com.google.common.collect.Maps
import io.github.melin.superior.common.AlterActionType
import java.util.HashMap

data class AlterDbPropsAction(
    var location: String? = null,
    var properties: HashMap<String, String> = Maps.newHashMap()
) : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.SET_PROPS
}

data class RenameDbAction(var newDatabaseName: String) : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.RENAME
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/alter/AlterMaterializedView.kt
================================================
package io.github.melin.superior.common.relational.alter

import io.github.melin.superior.common.*
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement
import kotlin.collections.ArrayList

data class AlterMaterializedView(override val tableId: TableId, private val action: AlterAction?) :
    AbsTableStatement() {
    override val statementType = StatementType.ALTER_MATERIALIZED_VIEW
    override val privilegeType = PrivilegeType.ALTER
    override val sqlType = SqlType.DDL

    val actions: ArrayList<AlterAction> = ArrayList()
    var ifExists: Boolean = false

    init {
        if (action != null) {
            actions.add(action)
        }
    }

    constructor(tableId: TableId) : this(tableId, null)

    fun addActions(list: List<AlterAction>) {
        actions.addAll(list)
    }

    fun firstAction(): AlterAction {
        return actions.first()
    }
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/alter/AlterTable.kt
================================================
package io.github.melin.superior.common.relational.alter

import io.github.melin.superior.common.*
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement
import kotlin.collections.ArrayList

data class AlterTable(
    override val tableId: TableId,
    private val action: AlterAction?,
) : AbsTableStatement() {
    override val statementType = StatementType.ALTER_TABLE
    override val privilegeType = PrivilegeType.ALTER
    override val sqlType = SqlType.DDL

    val actions: ArrayList<AlterAction> = ArrayList()
    var ifExists: Boolean = false

    init {
        if (action != null) {
            actions.add(action)
        }
    }

    constructor(tableId: TableId) : this(tableId, null)

    fun addAction(action: AlterAction) {
        actions.add(action)
    }

    fun addActions(list: List<AlterAction>) {
        actions.addAll(list)
    }

    fun firstAction(): AlterAction {
        return if (action != null) action else actions.first()
    }

    fun getFirstAlterType(): AlterActionType {
        val action = firstAction()
        return action.alterType
    }
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/alter/AlterView.kt
================================================
package io.github.melin.superior.common.relational.alter

import io.github.melin.superior.common.*
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement
import kotlin.collections.ArrayList

data class AlterView(override val tableId: TableId, private val action: AlterAction?) : AbsTableStatement() {
    override val statementType = StatementType.ALTER_VIEW
    override val privilegeType = PrivilegeType.ALTER
    override val sqlType = SqlType.DDL

    val actions: ArrayList<AlterAction> = ArrayList()
    var ifExists: Boolean = false

    init {
        if (action != null) {
            actions.add(action)
        }
    }

    constructor(tableId: TableId) : this(tableId, null)

    fun addActions(list: List<AlterAction>) {
        actions.addAll(list)
    }

    fun firstAction(): AlterAction {
        return actions.first()
    }
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/alter/DeltaAlterActions.kt
================================================
package io.github.melin.superior.common.relational.alter

import io.github.melin.superior.common.AlterActionType

class AlterAddConstraintAction() : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.ADD_CONSTRAINT
}

class AlterDropConstraintAction() : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.DROP_CONSTRAINT
}

class AlterDropFeatureAction() : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.DROP_FEATURE
}

class AlterClusterByAction() : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.CLUSTER_BY
}

class AlterSyncIdentityAction() : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.SYNC_IDENTITY
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/alter/IcebergAlterActions.kt
================================================
package io.github.melin.superior.common.relational.alter

import io.github.melin.superior.common.AlterActionType

data class AlterCreateTagAction(val tagName: String) : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.CREATE_TAG
}

data class AlterDropTagAction(val tagName: String) : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.DROP_TAG
}

data class AlterCreateBranchAction(val branchName: String) : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.CREATE_BRANCH
}

data class AlterDropBranchAction(val branchName: String) : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.DROP_BRANCH
}

data class AlterSetIdentifierFieldsAction(val fields: List<String>) : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.SET_IDENTIFIER_FIELDS
}

data class AlterDropIdentifierFieldsAction(val fields: List<String>) : AlterAction() {
    override var alterType: AlterActionType = AlterActionType.DROP_IDENTIFIER_FIELDS
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/AddResourceStatement.kt
================================================
package io.github.melin.superior.common.relational.common

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

class AddResourceStatement(val fileNames: List<String>, val resourceType: String) : Statement() {
    override val statementType = StatementType.ADD_RESOURCE
    override val privilegeType = PrivilegeType.OTHER
    override val sqlType = SqlType.DML

    constructor(fileName: String, resourceType: String) : this(listOf(fileName), resourceType)

    fun first(): String {
        return fileNames.first()
    }
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/CallProcedure.kt
================================================
package io.github.melin.superior.common.relational.common

import com.google.common.collect.Sets
import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.ProcedureId
import io.github.melin.superior.common.relational.Statement

data class CallProcedure(var procedureIds: HashSet<ProcedureId>, var properties: Map<String, String> = mapOf()) :
    Statement() {
    override val statementType = StatementType.CALL
    override val privilegeType = PrivilegeType.ADMIN
    override val sqlType = SqlType.DML

    constructor(procedureId: ProcedureId) : this(Sets.newHashSet(procedureId))

    constructor(
        procedureId: ProcedureId,
        properties: Map<String, String>
    ) : this(Sets.newHashSet(procedureId), properties)

    fun first(): ProcedureId {
        return procedureIds.first()
    }
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/CancelExport.kt
================================================
package io.github.melin.superior.common.relational.common

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

data class CancelExport(val database: String?, var queryId: String) : Statement() {
    override val statementType = StatementType.CANCEL_EXPORT
    override val privilegeType = PrivilegeType.ALTER
    override val sqlType = SqlType.DML

    constructor(queryId: String) : this(null, queryId)
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/CommentStatement.kt
================================================
package io.github.melin.superior.common.relational.common

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

data class CommentStatement(
    val comment: String? = null,
    val isNull: Boolean = false,
    val objType: String? = null,
    val objValue: String? = null
) : Statement() {
    override val statementType = StatementType.COMMENT
    override val privilegeType = PrivilegeType.ALTER
    override val sqlType = SqlType.TCL
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/DescModel.kt
================================================
package io.github.melin.superior.common.relational.common

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.FunctionId
import io.github.melin.superior.common.relational.SchemaId
import io.github.melin.superior.common.relational.Statement
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement
import io.github.melin.superior.common.relational.dml.QueryStmt
import org.apache.commons.lang3.StringUtils

class DescStatement(vararg val keywords: String) : Statement() {
    override val statementType = StatementType.DESC
    override val privilegeType = PrivilegeType.OTHER
    override val sqlType = SqlType.DML

    fun checkSql(sql: String): Boolean {
        val words = StringUtils.split(sql, " ")
        if (this.keywords.size != words.size) {
            return false
        }

        val size = this.keywords.size
        for (i in 0 until size) {
            if (!StringUtils.equalsIgnoreCase(this.keywords.get(i), words[i])) {
                return false
            }
        }

        return true
    }
}

// spark
data class DescFunction(val functionId: FunctionId) : Statement() {
    override val statementType = StatementType.DESC_FUNCTION
    override val privilegeType = PrivilegeType.READ
    override val sqlType = SqlType.DDL
}

data class DescCatalog(val catalog: String) : Statement() {
    override val statementType = StatementType.DESC_CATALOG
    override val privilegeType = PrivilegeType.READ
    override val sqlType = SqlType.DDL
}

// 适用pg 类型数据库
data class DescDatabase(val database: String) : Statement() {
    override val statementType = StatementType.DESC_DATABASE
    override val privilegeType = PrivilegeType.READ
    override val sqlType = SqlType.DDL
}

data class DescSchema(val schemaId: SchemaId) : Statement() {
    override val statementType = StatementType.DESC_SCHEMA
    override val privilegeType = PrivilegeType.READ
    override val sqlType = SqlType.DDL
}

data class DescTable(val tableId: TableId) : Statement() {
    override val statementType = StatementType.DESC_TABLE
    override val privilegeType = PrivilegeType.READ
    override val sqlType = SqlType.DDL
}

data class DescQuery(val queryStmt: QueryStmt) : Statement() {
    override val statementType = StatementType.DESC_QUERY
    override val privilegeType = PrivilegeType.READ
    override val sqlType = SqlType.DDL
}

// spark delta
data class DescDeltaDetail(override val tableId: TableId) : AbsTableStatement() {
    override val statementType = StatementType.DESC_DELTA_DETAIL
    override val privilegeType = PrivilegeType.READ
    override val sqlType = SqlType.DDL
}

// spark delta
data class DescDeltaHistory(override val tableId: TableId, val limit: Int? = null) : AbsTableStatement() {
    override val statementType = StatementType.DESC_DELTA_HISTORY
    override val privilegeType = PrivilegeType.READ
    override val sqlType = SqlType.DDL
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/ListResourceStatement.kt
================================================
package io.github.melin.superior.common.relational.common

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

class ListResourceStatement(val fileNames: List<String>, val resourceType: String) : Statement() {
    override val statementType = StatementType.ADD_RESOURCE
    override val privilegeType = PrivilegeType.OTHER
    override val sqlType = SqlType.DML

    constructor(fileName: String, resourceType: String) : this(listOf(fileName), resourceType)

    fun first(): String {
        return fileNames.first()
    }
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/ReSetStatement.kt
================================================
package io.github.melin.superior.common.relational.common

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

data class ReSetStatement(val key: String) : Statement() {
    override val statementType = StatementType.RESET
    override val privilegeType = PrivilegeType.OTHER
    override val sqlType = SqlType.TCL
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/RefreshMaterializedView.kt
================================================
package io.github.melin.superior.common.relational.common

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement
import io.github.melin.superior.common.relational.TableId

data class RefreshMaterializedView(
    val tableId: TableId,
    val force: Boolean = false,
    val mode: String = "Async",
    val partitionStart: String? = null,
    val partitionEnd: String? = null,
) : Statement() {
    override val statementType = StatementType.REFRESH_MV
    override val privilegeType = PrivilegeType.ADMIN
    override val sqlType = SqlType.DML
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/RemoveResourceStatement.kt
================================================
package io.github.melin.superior.common.relational.common

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

class RemoveResourceStatement(val fileNames: List<String>, val resourceType: String) : Statement() {
    override val statementType = StatementType.REMOVE_RESOURCE
    override val privilegeType = PrivilegeType.OTHER
    override val sqlType = SqlType.DML

    constructor(fileName: String, resourceType: String) : this(listOf(fileName), resourceType)

    fun first(): String {
        return fileNames.first()
    }
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/SetStatement.kt
================================================
package io.github.melin.superior.common.relational.common

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

data class SetStatement(val key: String, val value: String? = null) : Statement() {
    override val statementType = StatementType.SET
    override val privilegeType = PrivilegeType.OTHER
    override val sqlType = SqlType.TCL
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/ShowStatement.kt
================================================
package io.github.melin.superior.common.relational.common

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement
import org.apache.commons.lang3.StringUtils

class ShowStatement(vararg val keywords: String) : Statement() {
    override val statementType = StatementType.SHOW
    override val privilegeType = PrivilegeType.OTHER
    override val sqlType = SqlType.DML

    fun checkSql(sql: String): Boolean {
        val words = StringUtils.split(sql, " ")
        if (this.keywords.size != words.size) {
            return false
        }

        val size = this.keywords.size
        for (i in 0 until size) {
            if (!StringUtils.equalsIgnoreCase(this.keywords.get(i), words[i])) {
                return false
            }
        }

        return true
    }
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/SyncStatement.kt
================================================
package io.github.melin.superior.common.relational.common

import com.google.common.collect.Maps
import io.github.melin.superior.common.*
import io.github.melin.superior.common.relational.Statement
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.table.ColumnRel

data class SyncTable(
    var sinkTableId: TableId,
    var sourceTableId: TableId,
) : Statement() {
    override val statementType = StatementType.SYNC_TABLE
    override val privilegeType = PrivilegeType.CREATE
    override val sqlType = SqlType.DML

    val sinkOptions: HashMap<String, String> = Maps.newHashMap()

    val sourceOptions: HashMap<String, String> = Maps.newHashMap()

    var computeCols: List<ColumnRel>? = null
}

data class SyncDatabase(
    var sinkCatalogName: String?,
    var sinkDatabaseName: String,
    var sourceCatalogName: String?,
    var sourceDatabaseName: String,
    var includingTables: String = ".*"
) : Statement() {
    override val statementType = StatementType.SYNC_DATABASE
    override val privilegeType = PrivilegeType.CREATE
    override val sqlType = SqlType.DML

    val sinkOptions: HashMap<String, String> = Maps.newHashMap()

    val sourceOptions: HashMap<String, String> = Maps.newHashMap()

    var excludingTables: String? = null
}

data class SyncDatabaseMetadata(val catalogName: String?, val databaseName: String, val owner: String?) : Statement() {
    override val statementType = StatementType.SYNC_META
    override val privilegeType = PrivilegeType.OTHER
    override val sqlType = SqlType.DDL
}

data class SyncTableMetadata(val tableId: TableId, val owner: String?) : Statement() {
    override val statementType = StatementType.SYNC_META
    override val privilegeType = PrivilegeType.OTHER
    override val sqlType = SqlType.DDL
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/UseStatement.kt
================================================
package io.github.melin.superior.common.relational.common

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

data class UseCatalog(val catalogName: String) : Statement() {
    override val statementType = StatementType.USE
    override val privilegeType = PrivilegeType.OTHER
    override val sqlType = SqlType.DML
}

data class UseDatabase(val catalogName: String?, val databaseName: String) : Statement() {
    override val statementType = StatementType.USE
    override val privilegeType = PrivilegeType.OTHER
    override val sqlType = SqlType.DML

    constructor(databaseName: String) : this(null, databaseName)
}

data class UseSchema(val databaseName: String?, val schemaName: String) : Statement() {
    override val statementType = StatementType.USE
    override val privilegeType = PrivilegeType.OTHER
    override val sqlType = SqlType.DML

    constructor(databaseName: String) : this(null, databaseName)
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateCatalog.kt
================================================
package io.github.melin.superior.common.relational.create

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

class CreateCatalog(
    val catalogName: String,
    var properties: Map<String, String>? = null,
) : Statement() {
    override val statementType = StatementType.CREATE_CATALOG
    override val privilegeType = PrivilegeType.ADMIN
    override val sqlType = SqlType.DDL

    constructor(catalogName: String) : this(catalogName, null)
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateDatabase.kt
================================================
package io.github.melin.superior.common.relational.create

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

class CreateDatabase(
    val catalogName: String?,
    val databaseName: String,
    val location: String? = null,
    var properties: Map<String, String>? = null,
    var ifNotExists: Boolean = false,
) : Statement() {
    override val statementType = StatementType.CREATE_DATABASE
    override val privilegeType = PrivilegeType.CREATE
    override val sqlType = SqlType.DDL

    constructor(databaseName: String) : this(null, databaseName, null, null)

    constructor(
        catalogName: String?,
        databaseName: String,
        properties: Map<String, String>? = null,
        ifNotExists: Boolean = false
    ) : this(catalogName, databaseName, null, properties, ifNotExists)
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateFunction.kt
================================================
package io.github.melin.superior.common.relational.create

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.FunctionId
import io.github.melin.superior.common.relational.Statement

data class CreateFunction(
    val functionId: FunctionId,
    val childStatements: ArrayList<Statement>,
    var replace: Boolean = false,
    var temporary: Boolean = false,
    val className: String? = null,
    val file: String? = null
) : Statement() {
    override val statementType = StatementType.CREATE_FUNCTION
    override val privilegeType = PrivilegeType.CREATE
    override val sqlType = SqlType.DML

    var global: Boolean = false // starrocks
    var properties: Map<String, String>? = null // starrocks
    var argumentTypes: List<String>? = null // starrocks
    var returnType: String? = null // starrocks

    constructor(
        functionId: FunctionId,
        childStatements: ArrayList<Statement>,
        replace: Boolean
    ) : this(functionId, childStatements, replace, false)

    constructor(
        functionId: FunctionId,
        childStatements: ArrayList<Statement>
    ) : this(functionId, childStatements, false, false)
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateMaterializedView.kt
================================================
package io.github.melin.superior.common.relational.create

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement
import io.github.melin.superior.common.relational.dml.QueryStmt
import io.github.melin.superior.common.relational.table.ColumnRel

data class CreateMaterializedView(
    override val tableId: TableId,
    var queryStmt: QueryStmt,
    val comment: String? = null,
    var ifNotExists: Boolean = false, // 是否存在 if not exists 关键字
    var columnRels: List<ColumnRel>? = null
) : AbsTableStatement() {
    override val statementType = StatementType.CREATE_MATERIALIZED_VIEW
    override val privilegeType = PrivilegeType.CREATE
    override val sqlType = SqlType.DDL

    var modelType: String = "Sync" // 表模型类型
    var properties: Map<String, String> = mapOf()
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateProcedure.kt
================================================
package io.github.melin.superior.common.relational.create

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.ProcedureId
import io.github.melin.superior.common.relational.Statement

data class CreateProcedure(
    val procedureId: ProcedureId?,
    val childStatements: ArrayList<Statement>,
    var replace: Boolean = false,
    var temporary: Boolean = false,
    val className: String? = null,
    val file: String? = null
) : Statement() {
    override val statementType = StatementType.CREATE_PROCEDURE
    override val privilegeType = PrivilegeType.CREATE
    override val sqlType = SqlType.DML

    constructor(
        procedureId: ProcedureId,
        childStatements: ArrayList<Statement>,
        replace: Boolean
    ) : this(procedureId, childStatements, replace, false)

    constructor(childStatements: ArrayList<Statement>) : this(null, childStatements)
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateSchema.kt
================================================
package io.github.melin.superior.common.relational.create

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

class CreateSchema(val databaseName: String?, val schemaName: String) : Statement() {
    override val statementType = StatementType.CREATE_SCHEMA
    override val privilegeType = PrivilegeType.CREATE
    override val sqlType = SqlType.DDL

    constructor(schemaName: String) : this(null, schemaName)
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateTable.kt
================================================
package io.github.melin.superior.common.relational.create

import com.google.common.collect.Lists
import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.TableType
import io.github.melin.superior.common.relational.PartitionType
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement
import io.github.melin.superior.common.relational.table.ColumnRel

data class CreateTable(
    override val tableId: TableId,
    val tableType: TableType,
    val comment: String? = null,
    var lifeCycle: Int? = null,
    var partitionColumnRels: List<ColumnRel>? = null,
    var columnRels: List<ColumnRel>? = null,
    var properties: Map<String, String>? = null,
    var fileFormat: String? = null,
    var ifNotExists: Boolean = false, // 是否存在 if not exists 关键字
    var external: Boolean = false,
    var temporary: Boolean = false,
    var location: String? = null,
    var querySql: String? = null,
    val partitionColumnNames: ArrayList<String> = arrayListOf()
) : AbsTableStatement() { // 是否存在 if exists 关键字
    override val statementType = StatementType.CREATE_TABLE
    override val privilegeType = PrivilegeType.CREATE
    override val sqlType = SqlType.DDL

    // 建表方式:hive & spark. https://spark.apache.org/docs/3.2.0/sql-ref-syntax-ddl-create-table.html
    var replace = false
    var modelType: String = "hive" // 表模型类型
    var partitionType: PartitionType? = null // 分区类型
    var options: Map<String, String>? = null
    var clusteredColumns: List<String> = Lists.newArrayList() // 分桶表分桶列
    var sortedColumns: List<String> = Lists.newArrayList() // 分桶表排序列
    var storageHandler: String? = null

    constructor(
        tableId: TableId,
        tableType: TableType,
        comment: String?,
        columnRels: List<ColumnRel>?
    ) : this(tableId, tableType, comment, null, null, columnRels, null, null, false)

    constructor(
        tableId: TableId,
        tableType: TableType,
        comment: String?,
        lifeCycle: Int?,
        columnRels: List<ColumnRel>?
    ) : this(tableId, tableType, comment, lifeCycle, null, columnRels, null, null, false)

    constructor(
        tableId: TableId,
        tableType: TableType,
        comment: String? = null,
        columnRels: List<ColumnRel>? = null,
        ifNotExists: Boolean,
        properties: Map<String, String>? = null
    ) : this(tableId, tableType, comment, null, null, columnRels, properties, null, ifNotExists)
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateTableAsSelect.kt
================================================
package io.github.melin.superior.common.relational.create

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.PartitionType
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement
import io.github.melin.superior.common.relational.dml.QueryStmt
import io.github.melin.superior.common.relational.table.ColumnRel

data class CreateTableAsSelect(
    override val tableId: TableId,
    var queryStmt: QueryStmt,
    val comment: String? = null,
    var lifeCycle: Int? = null,
    var partitionColumnRels: List<ColumnRel>? = null,
    var columnRels: List<ColumnRel>? = null,
    var properties: Map<String, String>? = null,
    var fileFormat: String? = null,
    var ifNotExists: Boolean = false, // 是否存在 if not exists 关键字
    var locationPath: String? = null,
    val partitionColumnNames: ArrayList<String> = arrayListOf()
) : AbsTableStatement() { // 是否存在 if exists 关键字
    override val statementType = StatementType.CREATE_TABLE_AS_SELECT
    override val privilegeType = PrivilegeType.CREATE
    override val sqlType = SqlType.DDL

    var replace = false
    // 建表方式:hive & spark. https://spark.apache.org/docs/3.2.0/sql-ref-syntax-ddl-create-table.html
    var modelType: String = "hive"
    var partitionType: PartitionType? = null // 分区类型
    var options: Map<String, String>? = null
    var storageHandler: String? = null

    constructor(
        tableId: TableId,
        queryStmt: QueryStmt
    ) : this(tableId, queryStmt, null, null, null, null, null, null, false)

    constructor(
        tableId: TableId,
        queryStmt: QueryStmt,
        comment: String? = null,
        ifNotExists: Boolean,
        properties: Map<String, String>? = null
    ) : this(tableId, queryStmt, comment, null, null, null, properties, null, ifNotExists)
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateTableLike.kt
================================================
package io.github.melin.superior.common.relational.create

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement

data class CreateTableLike(
    val oldTableId: TableId,
    override val tableId: TableId,
    var ifNotExists: Boolean = false,
    var external: Boolean = false,
    var temporary: Boolean = false
) : AbsTableStatement() {
    override val statementType = StatementType.CREATE_TABLE_AS_LIKE
    override val privilegeType = PrivilegeType.CREATE
    override val sqlType = SqlType.DDL
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateView.kt
================================================
package io.github.melin.superior.common.relational.create

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement
import io.github.melin.superior.common.relational.dml.QueryStmt
import io.github.melin.superior.common.relational.table.ColumnRel

data class CreateView(
    override val tableId: TableId,
    var queryStmt: QueryStmt,
    val comment: String? = null,
    var ifNotExists: Boolean = false, // 是否存在 if not exists 关键字
    var columnRels: List<ColumnRel>? = null
) : AbsTableStatement() {
    override val statementType = StatementType.CREATE_VIEW
    override val privilegeType = PrivilegeType.CREATE
    override val sqlType = SqlType.DDL

    var replace: Boolean = false
    var temporary: Boolean = false
    var global: Boolean = false

    var fileFormat: String? = null
    var properties: Map<String, String> = mapOf()
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/delta/OptimizeTable.kt
================================================
package io.github.melin.superior.common.relational.delta

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement

data class OptimizeTable(override val tableId: TableId) : AbsTableStatement() {
    override val statementType = StatementType.OPTIMIZE_TABLE
    override val privilegeType = PrivilegeType.WRITE
    override val sqlType = SqlType.DML
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/delta/VacuumTable.kt
================================================
package io.github.melin.superior.common.relational.delta

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement

data class VacuumTable(override val tableId: TableId) : AbsTableStatement() {
    override val statementType = StatementType.VACUUM_TABLE
    override val privilegeType = PrivilegeType.WRITE
    override val sqlType = SqlType.DML
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/dml/DeleteTable.kt
================================================
package io.github.melin.superior.common.relational.dml

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement

data class DeleteTable(
    override val tableId: TableId,
    val inputTables: List<TableId>,
) : AbsTableStatement() {
    override val statementType = StatementType.DELETE
    override val privilegeType = PrivilegeType.WRITE
    override val sqlType = SqlType.DML

    val outputTables: ArrayList<TableId> = arrayListOf()

    init {
        if (!outputTables.contains(tableId)) {
            outputTables.add(tableId)
        }
    }
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/dml/InsertFiles.kt
================================================
package io.github.melin.superior.common.relational.dml

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

data class InsertFiles(
    val mode: InsertMode,
    val queryStmt: QueryStmt,
    var properties: Map<String, String>,
) : Statement() {
    override val statementType = StatementType.INSERT
    override val privilegeType = PrivilegeType.WRITE
    override val sqlType = SqlType.DML
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/dml/InsertMode.kt
================================================
package io.github.melin.superior.common.relational.dml

import java.io.Serializable

enum class InsertMode : Serializable {
    INTO,
    INTO_REPLACE,
    OVERWRITE,
    OVERWRITE_HIVE_DIR,
    OVERWRITE_DIR,
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/dml/InsertMultiTable.kt
================================================
package io.github.melin.superior.common.relational.dml

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

data class InsertMultiTable(
    val insertTables: List<InsertTable>,
) : Statement() {
    override val statementType = StatementType.UNKOWN
    override val privilegeType = PrivilegeType.OTHER
    override val sqlType = SqlType.DML
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/dml/InsertTable.kt
================================================
package io.github.melin.superior.common.relational.dml

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement
import io.github.melin.superior.common.relational.table.ColumnRel
import java.util.*
import kotlin.collections.ArrayList
import kotlin.collections.LinkedHashMap

data class InsertTable(
    val mode: InsertMode,
    val queryStmt: QueryStmt,
    override val tableId: TableId,
    var columnRels: List<ColumnRel>? = null,
) : AbsTableStatement() {
    override val statementType = StatementType.INSERT
    override val privilegeType = PrivilegeType.WRITE
    override val sqlType = SqlType.DML

    var properties: Map<String, String>? = null
    var fileFormat: String? = null
    var partitionVals: LinkedHashMap<String, String>? = null
    var rows: ArrayList<List<String>>? = null
    val outputTables: ArrayList<TableId> = arrayListOf()
    var hints: LinkedHashMap<String, LinkedList<String>>? = null

    var mysqlReplace: Boolean = false

    init {
        if (!outputTables.contains(tableId)) {
            outputTables.add(tableId)
        }
    }
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/dml/MergeTable.kt
================================================
package io.github.melin.superior.common.relational.dml

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement
import io.github.melin.superior.common.relational.TableId

data class MergeTable(
    var targetTable: TableId,
    var inputTables: List<TableId> = listOf(),
) : Statement() {
    override val statementType = StatementType.MERGE
    override val privilegeType = PrivilegeType.WRITE
    override val sqlType = SqlType.DML
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/dml/QueryStmt.kt
================================================
package io.github.melin.superior.common.relational.dml

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.FunctionId
import io.github.melin.superior.common.relational.Statement
import io.github.melin.superior.common.relational.TableId

data class QueryStmt(
    var inputTables: List<TableId>,
    var limit: Int? = null,
    var offset: Int? = null,
) : Statement() {
    override val statementType = StatementType.SELECT
    override val privilegeType = PrivilegeType.READ
    override val sqlType = SqlType.DQL

    val functionNames: HashSet<FunctionId> = hashSetOf()

    constructor() : this(listOf())
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/dml/UpdateTable.kt
================================================
package io.github.melin.superior.common.relational.dml

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement

data class UpdateTable(
    override val tableId: TableId,
    var inputTables: List<TableId>,
) : AbsTableStatement() {
    override val statementType = StatementType.UPDATE
    override val privilegeType = PrivilegeType.WRITE
    override val sqlType = SqlType.DML
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/drop/DropCatalog.kt
================================================
package io.github.melin.superior.common.relational.drop

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

class DropCatalog(val catalogName: String) : Statement() {
    override val statementType = StatementType.DROP_CATALOG
    override val privilegeType = PrivilegeType.ADMIN
    override val sqlType = SqlType.DDL
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/drop/DropDatabase.kt
================================================
package io.github.melin.superior.common.relational.drop

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

class DropDatabase(val catalogName: String?, val databaseName: String, var ifExists: Boolean = false) : Statement() {
    override val statementType = StatementType.DROP_DATABASE
    override val privilegeType = PrivilegeType.DROP
    override val sqlType = SqlType.DDL

    val databaseNames: ArrayList<String> = arrayListOf()

    constructor(databaseName: String) : this(null, databaseName)

    constructor(databaseName: String, ifExists: Boolean) : this(null, databaseName, ifExists)
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/drop/DropFunction.kt
================================================
package io.github.melin.superior.common.relational.drop

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.FunctionId
import io.github.melin.superior.common.relational.Statement

data class DropFunction(val functionId: FunctionId) : Statement() {
    override val statementType = StatementType.DROP_FUNCTION
    override val privilegeType = PrivilegeType.DROP
    override val sqlType = SqlType.DDL

    var argumentTypes: List<String>? = null // starrocks
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/drop/DropMaterializedView.kt
================================================
package io.github.melin.superior.common.relational.drop

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement

data class DropMaterializedView(override val tableId: TableId, var ifExists: Boolean = false) : AbsTableStatement() {
    override val statementType = StatementType.DROP_MATERIALIZED_VIEW
    override val privilegeType = PrivilegeType.DROP
    override val sqlType = SqlType.DDL

    val tableIds: ArrayList<TableId> = arrayListOf()
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/drop/DropProcedure.kt
================================================
package io.github.melin.superior.common.relational.drop

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.ProcedureId
import io.github.melin.superior.common.relational.Statement

data class DropProcedure(val procedureId: ProcedureId) : Statement() {
    override val statementType = StatementType.DROP_PROCEDURE
    override val privilegeType = PrivilegeType.DROP
    override val sqlType = SqlType.DDL
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/drop/DropSchema.kt
================================================
package io.github.melin.superior.common.relational.drop

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

class DropSchema(
    val databaseName: String?,
    val schemaName: String,
) : Statement() {
    override val statementType = StatementType.DROP_SCHEMA
    override val privilegeType = PrivilegeType.DROP
    override val sqlType = SqlType.DDL

    constructor(schemaName: String) : this(null, schemaName)
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/drop/DropSequence.kt
================================================
package io.github.melin.superior.common.relational.drop

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement

data class DropSequence(
    override val tableId: TableId,
    var ifExists: Boolean = false,
    var isMaterialized: Boolean = false,
) : AbsTableStatement() {
    override val statementType = StatementType.DROP_SEQUENCE
    override val privilegeType = PrivilegeType.DROP
    override val sqlType = SqlType.DDL

    val tableIds: ArrayList<TableId> = arrayListOf()
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/drop/DropTable.kt
================================================
package io.github.melin.superior.common.relational.drop

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement

data class DropTable(override val tableId: TableId, var ifExists: Boolean = false) : AbsTableStatement() {
    override val statementType = StatementType.DROP_TABLE
    override val privilegeType = PrivilegeType.DROP
    override val sqlType = SqlType.DDL

    val tableIds: ArrayList<TableId> = arrayListOf()
    var force: Boolean = false
    var purge: Boolean = false
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/drop/DropView.kt
================================================
package io.github.melin.superior.common.relational.drop

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement

data class DropView(override val tableId: TableId, var ifExists: Boolean = false) : AbsTableStatement() {
    override val statementType = StatementType.DROP_VIEW
    override val privilegeType = PrivilegeType.DROP
    override val sqlType = SqlType.DDL

    val tableIds: ArrayList<TableId> = arrayListOf()
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/enums.kt
================================================
package io.github.melin.superior.common.relational

enum class SortType {
    ASC,
    DESC,
    UNKOWN
}

enum class PartitionType {
    RANGE,
    LIST,
    HASH,
    KEY,
    VALUES,
    NORMAL,
    EXPRESSION
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/io/AlterLoadTable.kt
================================================
package io.github.melin.superior.common.relational.io

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

data class AlterLoadTable(
    val schemaName: String?,
    val labelName: String,
) : Statement() {
    override val statementType = StatementType.ALTER_LOAD_TABLE
    override val privilegeType = PrivilegeType.ALTER
    override val sqlType = SqlType.DML
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/io/CancelLoadTable.kt
================================================
package io.github.melin.superior.common.relational.io

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

data class CancelLoadTable(
    val schemaName: String?,
    val labelName: String,
) : Statement() {
    override val statementType = StatementType.CANCEL_LOAD_TABLE
    override val privilegeType = PrivilegeType.DROP
    override val sqlType = SqlType.DML
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/io/ExportTable.kt
================================================
package io.github.melin.superior.common.relational.io

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.FunctionId
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement

data class ExportTable(
    override val tableId: TableId,
    val path: String,
    var properties: Map<String, String>,
    var partitionVals: LinkedHashMap<String, String>,
    var fileFormat: String? = null,
    var compression: String? = null,
    var maxFileSize: String? = null,
    var overwrite: Boolean = false,
    var single: Boolean = false,
    var inputTables: ArrayList<TableId>,
) : AbsTableStatement() {
    override val statementType = StatementType.EXPORT_TABLE
    override val privilegeType = PrivilegeType.READ
    override val sqlType = SqlType.DML

    val functionNames: HashSet<FunctionId> = hashSetOf()

    constructor(
        tableId: TableId,
        path: String,
        properties: Map<String, String>,
    ) : this(tableId, path, properties, linkedMapOf(), null, null, null, false, false, arrayListOf())

    constructor(
        tableId: TableId,
        path: String,
        properties: Map<String, String>,
        partitionVals: LinkedHashMap<String, String>,
        fileFormat: String? = null,
        compression: String? = null,
        maxFileSize: String? = null,
        overwrite: Boolean = false,
        single: Boolean = false,
    ) : this(
        tableId,
        path,
        properties,
        partitionVals,
        fileFormat,
        compression,
        maxFileSize,
        overwrite,
        single,
        arrayListOf()
    )
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/io/LoadTable.kt
================================================
package io.github.melin.superior.common.relational.io

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.Statement

data class LoadTable(
    val schemaName: String?,
    val labelName: String,
    val tableNames: List<String>,
) : Statement() {
    override val statementType = StatementType.LOAD_TABLE
    override val privilegeType = PrivilegeType.CREATE
    override val sqlType = SqlType.DML
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/table/ColumnRel.kt
================================================
package io.github.melin.superior.common.relational.table

data class ColumnRel(
    val columnName: String,
    val typeName: String? = null,
    val comment: String? = null,
    var nullable: Boolean = true,
    var defaultExpr: String? = null,
    var primaryKey: Boolean = false,
    val columnDefType: ColumnDefType = ColumnDefType.COMPUTED
) {
    var columnLength = 0
    var precision = 0
    var scale = 0

    var expression: String? = null // 计算表达式
    var position: String? = null
    var afterCol: String? = null
    var jsonPath: String? = null // spark streaming sql json path

    var computedExpr: String? = null // 计算列
    var metadataKey: String? = null // 元数据列

    constructor(
        columnName: String,
        typeName: String?,
        comment: String?
    ) : this(columnName, typeName, comment, true, null)

    constructor(
        columnName: String,
        typeName: String?,
        comment: String?,
        primaryKey: Boolean = false,
        columnDefType: ColumnDefType
    ) : this(columnName, typeName, comment, true, null, primaryKey, columnDefType)

    constructor(
        columnName: String,
        typeName: String?,
        comment: String?,
        columnDefType: ColumnDefType
    ) : this(columnName, typeName, comment, true, null, false, columnDefType)
}

enum class ColumnDefType {
    PHYSICAL,
    METADATA,
    COMPUTED
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/table/RepairTable.kt
================================================
package io.github.melin.superior.common.relational.table

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement

class RepairTable(override val tableId: TableId) : AbsTableStatement() {
    override val statementType = StatementType.REPAIR_TABLE
    override val privilegeType = PrivilegeType.ADMIN
    override val sqlType = SqlType.DDL
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/table/TruncateTable.kt
================================================
package io.github.melin.superior.common.relational.table

import io.github.melin.superior.common.PrivilegeType
import io.github.melin.superior.common.SqlType
import io.github.melin.superior.common.StatementType
import io.github.melin.superior.common.relational.TableId
import io.github.melin.superior.common.relational.abs.AbsTableStatement

class TruncateTable(override val tableId: TableId, tableIds: ArrayList<TableId> = ArrayList()) : AbsTableStatement() {
    override val statementType = StatementType.TRUNCATE_TABLE
    override val privilegeType = PrivilegeType.WRITE
    override val sqlType = SqlType.DDL

    init {
        tableIds.add(tableId)
    }

    constructor(tableIds: ArrayList<TableId>) : this(tableIds.first(), tableIds)
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/type/AbsDataTimeType.kt
================================================
package io.github.melin.superior.common.type

abstract class AbsDataTimeType : AbsType() {}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/type/AbsNumericType.kt
================================================
package io.github.melin.superior.common.type

abstract class AbsNumericType : AbsType() {
    var character: String? = null
    var collate: String? = null
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/type/AbsStringType.kt
================================================
package io.github.melin.superior.common.type

abstract class AbsStringType : AbsType() {
    var character: String? = null
    var collate: String? = null
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/type/AbsType.kt
================================================
package io.github.melin.superior.common.type

abstract class AbsType : Type {
    override val alias: String? = null
    override val alias2: String? = null
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/type/Type.kt
================================================
package io.github.melin.superior.common.type

interface Type {
    val name: String
    val alias: String?
    val alias2: String? // 有些有多个别名,例如mysql integer有int 和 int4 两种
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/util/CommonUtils.kt
================================================
package com.github.melin.superior.sql.parser.util

import org.antlr.v4.runtime.ParserRuleContext
import org.antlr.v4.runtime.Token
import org.antlr.v4.runtime.tree.ParseTree
import org.antlr.v4.runtime.tree.TerminalNodeImpl
import org.apache.commons.lang3.StringUtils

/** Created by libinsong on 2017/4/10. */
object CommonUtils {

    val KEYWORD_REGEX = "'([A-Z_]+)'".toRegex()

    fun findShowStatementKeyWord(keyWords: ArrayList<String>, node: ParseTree) {
        if (node is TerminalNodeImpl) {
            val count = node.parent.childCount
            for (i in 0 until count) {
                val child = node.parent.getChild(i)
                if (child is TerminalNodeImpl) {
                    keyWords.add(child.text.uppercase())
                }
            }
        } else {
            findShowStatementKeyWord(keyWords, node.getChild(0))
        }
    }

    fun subsql(sql: String?, context: ParserRuleContext): String {
        val currSql = StringUtils.substring(sql, context.start.startIndex, context.stop.stopIndex + 1)
        return cleanLastSemi(currSql)
    }

    fun subsql(sql: String?, start: Token, stop: Token): String {
        val currSql = StringUtils.substring(sql, start.stopIndex + 1, stop.stopIndex + 1)
        return cleanLastSemi(currSql)
    }

    private fun cleanLastSemi(text: String): String {
        if (StringUtils.endsWith(text, ";")) {
            return StringUtils.substring(text, 0, text.length - 1)
        }

        return text
    }

    fun cleanQuote(value: String): String {
        if (StringUtils.isBlank(value)) {
            return value
        }

        var result = value
        if (StringUtils.startsWith(result, "'") && StringUtils.endsWith(result, "'")) {
            result = StringUtils.substring(result, 1, -1)
        }

        if (StringUtils.startsWith(result, "\"") && StringUtils.endsWith(result, "\"")) {
            result = StringUtils.substring(result, 1, -1)
        }

        if (StringUtils.startsWith(value, "`") && StringUtils.endsWith(value, "`")) {
            return StringUtils.substring(value, 1, -1)
        }

        return StringUtils.trim(result)
    }
}


================================================
FILE: superior-common-parser/src/main/kotlin/io/github/melin/superior/common/util/DateUtils.kt
================================================
package com.github.melin.superior.sql.parser.util

import java.time.DateTimeException
import java.time.LocalDateTime
import java.time.ZoneId
import java.time.format.DateTimeFormatter
import java.util.*

object DateUtils {
    fun getCurrentDateTime(): String {
        try {
            val ldt = LocalDateTime.ofInstant(Date().toInstant(), ZoneId.systemDefault())
            val format = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")
            return ldt.format(format)
        } catch (ex: DateTimeException) {
            throw RuntimeException(ex.message, ex)
        }
    }
}


================================================
FILE: superior-dameng-parser/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>io.github.melin.superior</groupId>
        <artifactId>superior-sql-parser</artifactId>
        <version>4.0.23</version>
    </parent>

    <artifactId>superior-dameng-parser</artifactId>
    <name>superior-dameng-parser</name>

    <dependencies>
        <dependency>
            <groupId>io.github.melin.superior</groupId>
            <artifactId>superior-common-parser</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</project>


================================================
FILE: superior-dameng-parser/src/main/antlr4/io/github/melin/superior/parser/dameng/antlr4/DmSqlLexer.g4
================================================
lexer grammar DmSqlLexer;


// Keywords

ABORT:                                 'ABORT';
ABSOLUTE:                              'ABSOLUTE';
ABSTRACT:                              'ABSTRACT';
ACCESSED:                              'ACCESSED';
ACCOUNT:                               'ACCOUNT';
ACROSS:                                'ACROSS';
ACTION:                                'ACTION';
ADD:                                   'ADD';
ADMIN:                                 'ADMIN';
ADVANCED:                              'ADVANCED';
AFTER:                                 'AFTER';
AGGREGATE:                             'AGGREGATE';
ALL:                                   'ALL';
ALLOW_DATETIME:                        'ALLOW_DATETIME';
ALLOW_IP:                              'ALLOW_IP';
ALTER:                                 'ALTER';
ALWAYS:                                'ALWAYS';
ANALYZE:                               'ANALYZE';
AND:                                   'AND';
ANY:                                   'ANY';
APPLY:                                 'APPLY';
APR:                                   'APR';
ARCHIVE:                               'ARCHIVE';
ARCHIVEDIR:                            'ARCHIVEDIR';
ARCHIVELOG:                            'ARCHIVELOG';
ARCHIVESTYLE:                          'ARCHIVESTYLE';
ARRAY:                                 'ARRAY';
ARRAYLEN:                              'ARRAYLEN';
AS:                                    'AS';
ASC:                                   'ASC';
ASCII:                                 'ASCII';
ASENSITIVE:                            'ASENSITIVE';
ASSIGN:                                'ASSIGN';
ASYNCHRONOUS:                          'ASYNCHRONOUS';
ATTACH:                                'ATTACH';
AT_KEYWORD:                            'AT';
AUDIT:                                 'AUDIT';
AUG:                                   'AUG';
AUTHID:                                'AUTHID';
AUTHORIZATION:                         'AUTHORIZATION';
AUTO:                                  'AUTO';
AUTOEXTEND:                            'AUTOEXTEND';
AUTONOMOUS_TRANSACTION:                'AUTONOMOUS_TRANSACTION';
AUTO_INCREMENT:                        'AUTO_INCREMENT';
AUTO_UPDATE:                           'AUTO_UPDATE';
AVG:                                   'AVG';
BACKED:                                'BACKED';
BACKUP:                                'BACKUP';
BACKUPDIR:                             'BACKUPDIR';
BACKUPINFO:                            'BACKUPINFO';
BACKUPSET:                             'BACKUPSET';
BADFILE:                               'BADFILE';
BAKFILE:                               'BAKFILE';
BASE:                                  'BASE';
BATCH:                                 'BATCH';
BEFORE:                                'BEFORE';
BEGIN:                                 'BEGIN';
BETWEEN:                               'BETWEEN';
BIGDATEDIFF:                           'BIGDATEDIFF';
BIGINT:                                'BIGINT';
BINARY_KEYWORD:                        'BINARY';
BIT:                                   'BIT';
BITMAP:                                'BITMAP';
BLOB:                                  'BLOB';
BLOCK:                                 'BLOCK';
BODY:                                  'BODY';
BOOL:                                  'BOOL';
BOOLEAN:                               'BOOLEAN';
BOTH:                                  'BOTH';
BRANCH:                                'BRANCH';
BREADTH:                               'BREADTH';
BREAK:                                 'BREAK';
BSTRING:                               'BSTRING';
BTREE:                                 'BTREE';
BUFFER:                                'BUFFER';
BUILD:                                 'BUILD';
BULK:                                  'BULK';
BULK_EXCEPTION:                        'BULK_EXCEPTION';
BULK_ROWCOUNT:                         'BULK_ROWCOUNT';
BY:                                    'BY';
BYDAY:                                 'BYDAY';
BYHOUR:                                'BYHOUR';
BYMINUTE:                              'BYMINUTE';
BYMONTH:                               'BYMONTH';
BYMONTHDAY:                            'BYMONTHDAY';
BYSECOND:                              'BYSECOND';
BYTE:                                  'BYTE';
BYWEEKNO:                              'BYWEEKNO';
BYYEARDAY:                             'BYYEARDAY';
CACHE:                                 'CACHE';
CALCULATE:                             'CALCULATE';
CALL:                                  'CALL';
CASCADE:                               'CASCADE';
CASCADED:                              'CASCADED';
CASE:                                  'CASE';
CASE_SENSITIVE:                        'CASE_SENSITIVE';
CAST:                                  'CAST';
CATALOG:                               'CATALOG';
CATCH:                                 'CATCH';
CHAIN:                                 'CHAIN';
CHANGE:                                'CHANGE';
CHAR:                                  'CHAR';
CHARACTER:                             'CHARACTER';
CHARACTERISTICS:                       'CHARACTERISTICS';
CHECK:                                 'CHECK';
CHECKPOINT:                            'CHECKPOINT';
CIPHER:                                'CIPHER';
CLASS:                                 'CLASS';
CLOB:                                  'CLOB';
CLOSE:                                 'CLOSE';
CLUSTER:                               'CLUSTER';
CLUSTERBTR:                            'CLUSTERBTR';
COLLATE:                               'COLLATE';
COLLATION:                             'COLLATION';
COLLECT:                               'COLLECT';
COLUMN:                                'COLUMN';
COLUMNS:                               'COLUMNS';
COMMENT:                               'COMMENT';
COMMIT:                                'COMMIT';
COMMITTED:                             'COMMITTED';
COMMITWORK:                            'COMMITWORK';
COMPILE:                               'COMPILE';
COMPLETE:                              'COMPLETE';
COMPRESS:                              'COMPRESS';
COMPRESSED:                            'COMPRESSED';
CONDITIONAL:                           'CONDITIONAL';
CONNECT:                               'CONNECT';
CONNECT_BY_IS_CYCLE:                   'CONNECT_BY_IS_CYCLE';
CONNECT_BY_IS_LEAF:                    'CONNECT_BY_IS_LEAF';
CONNECT_BY_ROOT:                       'CONNECT_BY_ROOT';
CONNECT_IDLE_TIME:                     'CONNECT_IDLE_TIME';
CONNECT_TIME:                          'CONNECT_TIME';
CONST:                                 'CONST';
CONSTANT:                              'CONSTANT';
CONSTRAINT:                            'CONSTRAINT';
CONSTRAINTS:                           'CONSTRAINTS';
CONSTRUCTOR:                           'CONSTRUCTOR';
CONSTR_OP:                             'CONSTR_OP';
CONTAINS:                              'CONTAINS';
CONTEXT:                               'CONTEXT';
CONTINUE:                              'CONTINUE';
CONVERT:                               'CONVERT';
COPY:                                  'COPY';
CORRESPONDING:                         'CORRESPONDING';
CORRUPT:                               'CORRUPT';
COUNT:                                 'COUNT';
COUNTER:                               'COUNTER';
CPU_PER_CALL:                          'CPU_PER_CALL';
CPU_PER_SESSION:                       'CPU_PER_SESSION';
CREATE:                                'CREATE';
CROSS:                                 'CROSS';
CRYPTO:                                'CRYPTO';
CTLFILE:                               'CTLFILE';
CUBE:                                  'CUBE';
CUMULATIVE:                            'CUMULATIVE';
CURRENT:                               'CURRENT';
CURRENT_SCHEMA:                        'CURRENT_SCHEMA';
CURRENT_USER:                          'CURRENT_USER';
CURSOR:                                'CURSOR';
CYCLE:                                 'CYCLE';
DAILY:                                 'DAILY';
DANGLING:                              'DANGLING';
DATA:                                  'DATA';
DATABASE:                              'DATABASE';
DATAFILE:                              'DATAFILE';
DATE:                                  'DATE';
DATEADD:                               'DATEADD';
DATEDIFF:                              'DATEDIFF';
DATEPART:                              'DATEPART';
DATETIME:                              'DATETIME';
DAY:                                   'DAY';
DBFILE:                                'DBFILE';
DDL:                                   'DDL';
DDL_CLONE:                             'DDL_CLONE';
DEBUG:                                 'DEBUG';
DEC:                                   'DEC';
DECIMAL:                               'DECIMAL';
DECLARE:                               'DECLARE';
DECODE:                                'DECODE';
DEFAULT:                               'DEFAULT';
DEFERRABLE:                            'DEFERRABLE';
DEFERRED:                              'DEFERRED';
DEFINER:                               'DEFINER';
DELETE:                                'DELETE';
DELETING:                              'DELETING';
DELIMITED:                             'DELIMITED';
DELTA:                                 'DELTA';
DEMAND:                                'DEMAND';
DENSE_RANK:                            'DENSE_RANK';
DEPTH:                                 'DEPTH';
DEREF:                                 'DEREF';
DESC:                                  'DESC';
DETACH:                                'DETACH';
DETERMINISTIC:                         'DETERMINISTIC';
DEVICE:                                'DEVICE';
DIAGNOSTICS:                           'DIAGNOSTICS';
DICTIONARY:                            'DICTIONARY';
DIRECTORY:                             'DIRECTORY';
DISABLE:                               'DISABLE';
DISCONNECT:                            'DISCONNECT';
DISKGROUP:                             'DISKGROUP';
DISKSPACE:                             'DISKSPACE';
DISTINCT:                              'DISTINCT';
DISTRIBUTED:                           'DISTRIBUTED';
DML:                                   'DML';
DO:                                    'DO';
DOMAIN:                                'DOMAIN';
DOUBLE:                                'DOUBLE';
DOWN:                                  'DOWN';
DROP:                                  'DROP';
DUMP:                                  'DUMP';
EACH:                                  'EACH';
EDITIONABLE:                           'EDITIONABLE';
ELSE:                                  'ELSE';
ELSEIF:                                ('ELSEIF' | 'ELSIF');
EMPTY:                                 'EMPTY';
ENABLE:                                'ENABLE';
ENCRYPT:                               'ENCRYPT';
ENCRYPTION:                            'ENCRYPTION';
END:                                   'END';
EQU:                                   'EQU';
ERROR:                                 'ERROR';
ERRORS:                                'ERRORS';
ESCAPE:                                'ESCAPE';
EVALNAME:                              'EVALNAME';
EVENTINFO:                             'EVENTINFO';
EVENTS:                                'EVENTS';
EVERY:                                 'EVERY';
EXCEPT:                                'EXCEPT';
EXCEPTION:                             'EXCEPTION';
EXCEPTIONS:                            'EXCEPTIONS';
EXCEPTION_INIT:                        'EXCEPTION_INIT';
EXCHANGE:                              'EXCHANGE';
EXCLUDE:                               'EXCLUDE';
EXCLUDING:                             'EXCLUDING';
EXCLUSIVE:                             'EXCLUSIVE';
EXECUTE:                               'EXECUTE';
EXISTS:                                'EXISTS';
EXIT:                                  'EXIT';
EXPIRE:                                'EXPIRE';
EXPLAIN:                               'EXPLAIN';
EXTENDS:                               'EXTENDS';
EXTERN:                                'EXTERN';
EXTERNAL:                              'EXTERNAL';
EXTERNALLY:                            'EXTERNALLY';
EXTRACT:                               'EXTRACT';
FAILED_LOGIN_ATTEMPS:                  'FAILED_LOGIN_ATTEMPS';
FAILED_LOGIN_ATTEMPTS:                 'FAILED_LOGIN_ATTEMPTS';
FALSE:                                 'FALSE';
FAST:                                  'FAST';
FEB:                                   'FEB';
FETCH:                                 'FETCH';
FIELDS:                                'FIELDS';
FILE:                                  'FILE';
FILEGROUP:                             'FILEGROUP';
FILESIZE:                              'FILESIZE';
FILLFACTOR:                            'FILLFACTOR';
FINAL:                                 'FINAL';
FINALLY:                               'FINALLY';
FIRST:                                 'FIRST';
FLASHBACK:                             'FLASHBACK';
FLOAT:                                 'FLOAT';
FOLLOWING:                             'FOLLOWING';
FOR:                                   'FOR';
FORALL:                                'FORALL';
FORCE:                                 'FORCE';
FOREIGN:                               'FOREIGN';
FORMAT:                                'FORMAT';
FOUND:                                 'FOUND';
FREQ:                                  'FREQ';
FREQUENCE:                             'FREQUENCE';
FRI:                                   'FRI';
FROM:                                  'FROM';
FULL:                                  'FULL';
FULLY:                                 'FULLY';
FUNCTION:                              'FUNCTION';
GENERATE:                              'GENERATE';
GENERATED:                             'GENERATED';
GET:                                   'GET';
GLOBAL:                                'GLOBAL';
GLOBALLY:                              'GLOBALLY';
GOTO:                                  'GOTO';
GRANT:                                 'GRANT';
GREAT:                                 'GREAT';
GROUP:                                 'GROUP';
GROUPING:                              'GROUPING';
HASH:                                  'HASH';
HASHPARTMAP:                           'HASHPARTMAP';
HAVING:                                'HAVING';
HEXTORAW:                              'HEXTORAW';
HIDDEN_KEYWORD:                        'HIDDEN';
HIGH:                                  'HIGH';
HOLD:                                  'HOLD';
HOUR:                                  'HOUR';
HOURLY:                                'HOURLY';
HUGE:                                  'HUGE';
IDENTIFIED:                            'IDENTIFIED';
IDENTIFIER_KEYWORD:                    'IDENTIFIER';
IDENTITY:                              'IDENTITY';
IDENTITY_INSERT:                       'IDENTITY_INSERT';
IF:                                    'IF';
IFNULL:                                'IFNULL';
IGNORE:                                'IGNORE';
IGNORE_ROW_ON_DUPKEY_INDEX:            'IGNORE_ROW_ON_DUPKEY_INDEX';
IMAGE:                                 'IMAGE';
IMMEDIATE:                             'IMMEDIATE';
IN:                                    'IN';
INCLUDE:                               'INCLUDE';
INCLUDING:                             'INCLUDING';
INCREASE:                              'INCREASE';
INCREMENT:                             'INCREMENT';
INDEX:                                 'INDEX';
INDEXES:                               'INDEXES';
INDICES:                               'INDICES';
INITIAL:                               'INITIAL';
INITIALIZED:                           'INITIALIZED';
INITIALLY:                             'INITIALLY';
INLINE:                                'INLINE';
INNER:                                 'INNER';
INNERID:                               'INNERID';
INPUT:                                 'INPUT';
INSENSITIVE:                           'INSENSITIVE';
INSERT:                                'INSERT';
INSERTING:                             'INSERTING';
INSTANCE:                              'INSTANCE';
INSTANTIABLE:                          'INSTANTIABLE';
INSTEAD:                               'INSTEAD';
INT:                                   'INT';
INTEGER:                               'INTEGER';
INTENT:                                'INTENT';
INTERSECT:                             'INTERSECT';
INTERVAL:                              'INTERVAL';
INTO:                                  'INTO';
INVISIBLE:                             'INVISIBLE';
IS:                                    'IS';
ISOLATION:                             'ISOLATION';
JAN:                                   'JAN';
JAVA:                                  'JAVA';
JOB:                                   'JOB';
JOIN:                                  'JOIN';
JSON:                                  'JSON';
JSON_TABLE:                            'JSON_TABLE';
JUL:                                   'JUL';
JUN:                                   'JUN';
KEEP:                                  'KEEP';
KEY:                                   'KEY';
KEYS:                                  'KEYS';
LABEL:                                 'LABEL';
LARGE:                                 'LARGE';
LAST:                                  'LAST';
LAST2:                                 'LAST2';
LAX:                                   'LAX';
LEAD:                                  'LEADING';
LEFT:                                  'LEFT';
LEFTARG:                               'LEFTARG';
LESS:                                  'LESS';
LEVEL:                                 'LEVEL';
LEVELS:                                'LEVELS';
LEXER:                                 'LEXER';
LIKE:                                  'LIKE';
LIMIT:                                 'LIMIT';
LINK:                                  'LINK';
LIST:                                  'LIST';
LNNVL:                                 'LNNVL';
LOB:                                   'LOB';
LOCAL:                                 'LOCAL';
LOCALLY:                               'LOCALLY';
LOCAL_OBJECT:                          'LOCAL_OBJECT';
LOCATION:                              'LOCATION';
LOCK:                                  'LOCK';
LOCKED:                                'LOCKED';
LOG:                                   'LOG';
LOGFILE:                               'LOGFILE';
LOGGING:                               'LOGGING';
LOGIC:                                 'LOGIC';
LOGIN:                                 'LOGIN';
LOGOFF:                                'LOGOFF';
LOGON:                                 'LOGON';
LOGOUT:                                'LOGOUT';
LONG:                                  'LONG';
LONGVARBINARY:                         'LONGVARBINARY';
LONGVARCHAR:                           'LONGVARCHAR';
LOOP:                                  'LOOP';
LSN:                                   'LSN';
MANUAL:                                'MANUAL';
MAP:                                   'MAP';
MAPPED:                                'MAPPED';
MAR:                                   'MAR';
MATCH:                                 'MATCH';
MATCHED:                               'MATCHED';
MATERIALIZED:                          'MATERIALIZED';
MAX:                                   'MAX';
MAXPIECESIZE:                          'MAXPIECESIZE';
MAXSIZE:                               'MAXSIZE';
MAXVALUE:                              'MAXVALUE';
MAX_RUN_DURATION:                      'MAX_RUN_DURATION';
MAY:                                   'MAY';
MEMBER:                                'MEMBER';
MEMORY:                                'MEMORY';
MEM_SPACE:                             'MEM_SPACE';
MERGE:                                 'MERGE';
MICRO:                                 'MICRO';
MIN:                                   'MIN';
MINEXTENTS:                            'MINEXTENTS';
MINUS:                                 'MINUS';
MINUTE:                                'MINUTE';
MINUTELY:                              'MINUTELY';
MINVALUE:                              'MINVALUE';
MIRROR:                                'MIRROR';
MOD:                                   'MOD';
MODE:                                  'MODE';
MODIFY:                                'MODIFY';
MON:                                   'MON';
MONEY:                                 'MONEY';
MONITORING:                            'MONITORING';
MONTH:                                 'MONTH';
MONTHLY:                               'MONTHLY';
MOUNT:                                 'MOUNT';
MOVE:                                  'MOVE';
MOVEMENT:                              'MOVEMENT';
MULTISET:                              'MULTISET';
NATIONAL:                              'NATIONAL';
NATURAL:                               'NATURAL';
NCHAR:                                 'NCHAR';
NCHARACTER:                            'NCHARACTER';
NESTED_PATH:                           'NESTED_PATH';
NEVER:                                 'NEVER';
NEW:                                   'NEW';
NEXT:                                  'NEXT';
NO:                                    'NO';
NOARCHIVELOG:                          'NOARCHIVELOG';
NOAUDIT:                               'NOAUDIT';
NOBRANCH:                              'NOBRANCH';
NOCACHE:                               'NOCACHE';
NOCOPY:                                'NOCOPY';
NOCYCLE:                               'NOCYCLE';
NODE:                                  'NODE';
NOLOCK:                                'NOLOCK';
NOLOGGING:                             'NOLOGGING';
NOMAXVALUE:                            'NOMAXVALUE';
NOMINVALUE:                            'NOMINVALUE';
NOMONITORING:                          'NOMONITORING';
NONE:                                  'NONE';
NONEDITIONABLE:                        'NONEDITIONABLE';
NOORDER:                               'NOORDER';
NOPARALLEL:                            'NOPARALLEL';
NORMAL:                                'NORMAL';
NOROWDEPENDENCIES:                     'NOROWDEPENDENCIES';
NOSORT:                                'NOSORT';
NOT:                                   'NOT';
NOTFOUND:                              'NOT_FOUND';
NOT_ALLOW_DATETIME:                    'NOT_ALLOW_DATETIME';
NOT_ALLOW_IP:                          'NOT_ALLOW_IP';
NOV:                                   'NOV';
NOVALIDATE:                            'NOVALIDATE';
NOWAIT:                                'NOWAIT';
NULL:                                  'NULL';
NULLS:                                 'NULLS';
NUMBER:                                'NUMBER';
NUMERIC:                               'NUMERIC';
OBJECT:                                'OBJECT';
OCT:                                   'OCT';
OF:                                    'OF';
OFF:                                   'OFF';
OFFLINE:                               'OFFLINE';
OFFSET:                                'OFFSET';
OIDINDEX:                              'OIDINDEX';
OLD:                                   'OLD';
ON:                                    'ON';
ONCE:                                  'ONCE';
ONLINE:                                'ONLINE';
ONLY:                                  'ONLY';
OPEN:                                  'OPEN';
OPERATOR:                              'OPERATOR';
OPTIMIZE:                              'OPTIMIZE';
OPTION:                                'OPTION';
OR:                                    'OR';
ORDER:                                 'ORDER';
ORDINALITY:                            'ORDINALITY';
OUT:                                   'OUT';
OUTER:                                 'OUTER';
OVER:                                  'OVER';
OVERLAPS:                              'OVERLAPS';
OVERLAY:                               'OVERLAY';
OVERRIDE:                              'OVERRIDE';
OVERRIDING:                            'OVERRIDING';
PACKAGE:                               'PACKAGE';
PAD:                                   'PAD';
PAGE:                                  'PAGE';
PARALLEL:                              'PARALLEL';
PARALLEL_ENABLE:                       'PARALLEL_ENABLE';
PARMS:                                 'PARMS';
PARTIAL:                               'PARTIAL';
PARTITION:                             'PARTITION';
PARTITIONS:                            'PARTITIONS';
PASSING:                               'PASSING';
PASSWORD:                              'PASSWORD';
PASSWORD_GRACE_TIME:                   'PASSWORD_GRACE_TIME';
PASSWORD_LIFE_TIME:                    'PASSWORD_LIFE_TIME';
PASSWORD_LOCK_TIME:                    'PASSWORD_LOCK_TIME';
PASSWORD_POLICY:                       'PASSWORD_POLICY';
PASSWORD_REUSE_MAX:                    'PASSWORD_REUSE_MAX';
PASSWORD_REUSE_TIME:                   'PASSWORD_REUSE_TIME';
PATH:                                  'PATH';
PENDANT:                               'PENDANT';
PERCENT:                               'PERCENT';
PIPE:                                  'PIPE';
PIPELINED:                             'PIPELINED';
PIVOT:                                 'PIVOT';
PLACING:                               'PLACING';
PRAGMA:                                'PRAGMA';
PREBUILT:                              'PREBUILT';
PRECEDING:                             'PRECEDING';
PRECISION:                             'PRECISION';
PRESERVE:                              'PRESERVE';
PRETTY:                                'PRETTY';
PRIMARY:                               'PRIMARY';
PRINT:                                 'PRINT';
PRIOR:                                 'PRIOR';
PRIVATE:                               'PRIVATE';
PRIVILEGE:                             'PRIVILEGE';
PRIVILEGES:                            'PRIVILEGES';
PROCEDURE:                             'PROCEDURE';
PROFILE:                               'PROFILE';
PROTECTED:                             'PROTECTED';
PT_BULK_ROWCOUNT:                      'PT_BULK_ROWCOUNT';
PT_ROWCOUNT:                           'PT_ROWCOUNT';
PT_ROWCOUNT2:                          'PT_ROWCOUNT2';
PUBLIC:                                'PUBLIC';
PURGE:                                 'PURGE';
QUERY:                                 'QUERY';
QUERY_REWRITE_INTEGRITY:               'QUERY_REWRITE_INTEGRITY';
QUOTA:                                 'QUOTA';
RAISE:                                 'RAISE';
RANDOMLY:                              'RANDOMLY';
RANGE:                                 'RANGE';
RAWTOHEX:                              'RAWTOHEX';
READ:                                  'READ';
READONLY:                              'READONLY';
READ_PER_CALL:                         'READ_PER_CALL';
READ_PER_SESSION:                      'READ_PER_SESSION';
REAL:                                  'REAL';
REBUILD:                               'REBUILD';
RECORD:                                'RECORD';
RECORDS:                               'RECORDS';
RECURSIVE:                             'RECURSIVE';
REDUCED:                               'REDUCED';
REF:                                   'REF';
REFERENCE:                             'REFERENCE';
REFERENCES:                            'REFERENCES';
REFERENCING:                           'REFERENCING';
REFRESH:                               'REFRESH';
REJECT:                                'REJECT';
RELATED:                               'RELATED';
RELATIVE:                              'RELATIVE';
RENAME:                                'RENAME';
REPEAT:                                'REPEAT';
REPEATABLE:                            'REPEATABLE';
REPLACE:                               'REPLACE';
REPLAY:                                'REPLAY';
REPLICATE:                             'REPLICATE';
RESPECT:                               'RESPECT';
RESIZE:                                'RESIZE';
RESTORE:                               'RESTORE';
RESTRICT:                              'RESTRICT';
RESTRICT_REFERENCES:                   'RESTRICT_REFERENCES';
RESULT:                                'RESULT';
RESULT_CACHE:                          'RESULT_CACHE';
RETURN:                                'RETURN';
RETURNING:                             'RETURNING';
REUSE:                                 'REUSE';
REVERSE:                               'REVERSE';
REVOKE:                                'REVOKE';
REWRITE:                               'REWRITE';
RIGHT:                                 'RIGHT';
RIGHTARG:                              'RIGHTARG';
ROLE:                                  'ROLE';
ROLLBACK:                              'ROLLBACK';
ROLLFILE:                              'ROLLFILE';
ROLLUP:     
Download .txt
gitextract_hvwwon62/

├── .gitignore
├── LICENSE
├── README.md
├── pom.xml
├── superior-appjar-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── job/
│       │   │                           └── antlr4/
│       │   │                               ├── AppJarLexer.g4
│       │   │                               └── AppJarParser.g4
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── appjar/
│       │                               ├── AbstractJarParser.kt
│       │                               ├── AppJarAntlr4Visitor.kt
│       │                               ├── AppJarHelper.kt
│       │                               └── AppJarInfo.kt
│       └── test/
│           ├── kotlin/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── appjar/
│           │                           └── AppJarParserTest.kt
│           └── resources/
│               └── log4j2.xml
├── superior-arithmetic-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── antlr4/
│       │   │                           └── arithmetic/
│       │   │                               └── Arithmetic.g4
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── arithmetic/
│       │                               ├── AbstractArithParser.kt
│       │                               ├── ArithmeticAntlr4Visitor.kt
│       │                               ├── ArithmeticHelper.kt
│       │                               └── Data.kt
│       └── test/
│           ├── kotlin/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── arithmetic/
│           │                           └── ArithmetricParserTest.kt
│           └── resources/
│               └── log4j2.xml
├── superior-common-parser/
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── common/
│           │                       └── antlr4/
│           │                           ├── AntlrCaches.java
│           │                           ├── Origin.java
│           │                           ├── ParseErrorListener.java
│           │                           ├── ParseException.java
│           │                           ├── ParserUtils.java
│           │                           └── UpperCaseCharStream.java
│           └── kotlin/
│               └── io/
│                   └── github/
│                       └── melin/
│                           └── superior/
│                               └── common/
│                                   ├── AlterActionType.kt
│                                   ├── PrivilegeType.kt
│                                   ├── SQLParserException.kt
│                                   ├── SqlType.kt
│                                   ├── StatementType.kt
│                                   ├── TableType.kt
│                                   ├── relational/
│                                   │   ├── AnalyzeTable.kt
│                                   │   ├── DefaultStatement.kt
│                                   │   ├── FunctionId.kt
│                                   │   ├── ProcedureId.kt
│                                   │   ├── SchemaId.kt
│                                   │   ├── Statement.kt
│                                   │   ├── TableId.kt
│                                   │   ├── abs/
│                                   │   │   ├── AbsDatabaseStatement.kt
│                                   │   │   └── AbsTableStatement.kt
│                                   │   ├── alter/
│                                   │   │   ├── AlterAction.kt
│                                   │   │   ├── AlterActions.kt
│                                   │   │   ├── AlterDatabase.kt
│                                   │   │   ├── AlterDatabaseActions.kt
│                                   │   │   ├── AlterMaterializedView.kt
│                                   │   │   ├── AlterTable.kt
│                                   │   │   ├── AlterView.kt
│                                   │   │   ├── DeltaAlterActions.kt
│                                   │   │   └── IcebergAlterActions.kt
│                                   │   ├── common/
│                                   │   │   ├── AddResourceStatement.kt
│                                   │   │   ├── CallProcedure.kt
│                                   │   │   ├── CancelExport.kt
│                                   │   │   ├── CommentStatement.kt
│                                   │   │   ├── DescModel.kt
│                                   │   │   ├── ListResourceStatement.kt
│                                   │   │   ├── ReSetStatement.kt
│                                   │   │   ├── RefreshMaterializedView.kt
│                                   │   │   ├── RemoveResourceStatement.kt
│                                   │   │   ├── SetStatement.kt
│                                   │   │   ├── ShowStatement.kt
│                                   │   │   ├── SyncStatement.kt
│                                   │   │   └── UseStatement.kt
│                                   │   ├── create/
│                                   │   │   ├── CreateCatalog.kt
│                                   │   │   ├── CreateDatabase.kt
│                                   │   │   ├── CreateFunction.kt
│                                   │   │   ├── CreateMaterializedView.kt
│                                   │   │   ├── CreateProcedure.kt
│                                   │   │   ├── CreateSchema.kt
│                                   │   │   ├── CreateTable.kt
│                                   │   │   ├── CreateTableAsSelect.kt
│                                   │   │   ├── CreateTableLike.kt
│                                   │   │   └── CreateView.kt
│                                   │   ├── delta/
│                                   │   │   ├── OptimizeTable.kt
│                                   │   │   └── VacuumTable.kt
│                                   │   ├── dml/
│                                   │   │   ├── DeleteTable.kt
│                                   │   │   ├── InsertFiles.kt
│                                   │   │   ├── InsertMode.kt
│                                   │   │   ├── InsertMultiTable.kt
│                                   │   │   ├── InsertTable.kt
│                                   │   │   ├── MergeTable.kt
│                                   │   │   ├── QueryStmt.kt
│                                   │   │   └── UpdateTable.kt
│                                   │   ├── drop/
│                                   │   │   ├── DropCatalog.kt
│                                   │   │   ├── DropDatabase.kt
│                                   │   │   ├── DropFunction.kt
│                                   │   │   ├── DropMaterializedView.kt
│                                   │   │   ├── DropProcedure.kt
│                                   │   │   ├── DropSchema.kt
│                                   │   │   ├── DropSequence.kt
│                                   │   │   ├── DropTable.kt
│                                   │   │   └── DropView.kt
│                                   │   ├── enums.kt
│                                   │   ├── io/
│                                   │   │   ├── AlterLoadTable.kt
│                                   │   │   ├── CancelLoadTable.kt
│                                   │   │   ├── ExportTable.kt
│                                   │   │   └── LoadTable.kt
│                                   │   └── table/
│                                   │       ├── ColumnRel.kt
│                                   │       ├── RepairTable.kt
│                                   │       └── TruncateTable.kt
│                                   ├── type/
│                                   │   ├── AbsDataTimeType.kt
│                                   │   ├── AbsNumericType.kt
│                                   │   ├── AbsStringType.kt
│                                   │   ├── AbsType.kt
│                                   │   └── Type.kt
│                                   └── util/
│                                       ├── CommonUtils.kt
│                                       └── DateUtils.kt
├── superior-dameng-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── dameng/
│       │   │                           └── antlr4/
│       │   │                               ├── DmSqlLexer.g4
│       │   │                               └── DmSqlParser.g4
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── dameng/
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── DmSqlAntlr4Visitor.kt
│       │                               └── DmSqlHelper.kt
│       └── test/
│           ├── kotlin/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── dameng/
│           │                           ├── DmSqlParserDdlTest.kt
│           │                           ├── DmSqlParserDmlTest.kt
│           │                           └── DmSqlProcedureParserTest.kt
│           └── resources/
│               ├── insert.sql
│               └── log4j2.xml
├── superior-flink-parser/
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── flink/
│       │   │                           └── antlr4/
│       │   │                               ├── FlinkSqlLexer.g4
│       │   │                               └── FlinkSqlParser.g4
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── flink/
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── FlinkSqlAntlr4Visitor.kt
│       │                               └── FlinkSqlHelper.kt
│       └── test/
│           ├── kotlin/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── flink/
│           │                           ├── FlinkCheckSql.kt
│           │                           ├── FlinkSqlParserDdlTest.kt
│           │                           └── FlinkSqlParserDmlTest.kt
│           └── resources/
│               └── log4j2.xml
├── superior-mysql-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── mysql/
│       │   │                           └── antlr4/
│       │   │                               ├── MySqlLexer.g4
│       │   │                               └── MySqlParser.g4
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── mysql/
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── MySqlAntlr4Visitor.kt
│       │                               ├── MySqlHelper.kt
│       │                               └── type/
│       │                                   ├── JsonType.kt
│       │                                   ├── datetime.kt
│       │                                   ├── numeric.kt
│       │                                   └── string.kt
│       └── test/
│           ├── kotlin/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── mysql/
│           │                           ├── MySqlParserDdlTest.kt
│           │                           ├── MySqlParserDmlTest.kt
│           │                           └── MySqlProcedureParserTest.kt
│           └── resources/
│               └── log4j2.xml
├── superior-oracle-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── oracle/
│       │   │                           └── antlr4/
│       │   │                               ├── OracleLexer.g4
│       │   │                               └── OracleParser.g4
│       │   ├── java/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── oracle/
│       │   │                           └── antlr4/
│       │   │                               ├── OracleLexerBase.java
│       │   │                               └── OracleParserBase.java
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── oracle/
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── OracleSqlAntlr4Visitor.kt
│       │                               └── OracleSqlHelper.kt
│       └── test/
│           ├── java/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── oracle/
│           │                           ├── OracleProcessParserTest.kt
│           │                           ├── OracleSqlParserDdlTest.kt
│           │                           └── OracleSqlParserDmlTest.kt
│           └── resources/
│               ├── insert.sql
│               └── log4j2.xml
├── superior-postgres-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── postgre/
│       │   │                           └── antlr4/
│       │   │                               ├── PostgreSqlLexer.g4
│       │   │                               └── PostgreSqlParser.g4
│       │   ├── java/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── postgre/
│       │   │                           └── antlr4/
│       │   │                               ├── LexerDispatchingErrorListener.java
│       │   │                               ├── ParserDispatchingErrorListener.java
│       │   │                               ├── PostgreSqlLexerBase.java
│       │   │                               └── PostgreSqlParserBase.java
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── postgre/
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── PostgreSqlAntlr4Visitor.kt
│       │                               ├── PostgreSqlHelper.kt
│       │                               ├── relational/
│       │                               │   └── CreatePartitionTable.kt
│       │                               └── type/
│       │                                   ├── BooleanType.kt
│       │                                   ├── JsonType.kt
│       │                                   ├── datetime.kt
│       │                                   ├── numeric.kt
│       │                                   └── string.kt
│       └── test/
│           ├── java/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── postgre/
│           │                           ├── PostgreSqlParserDdlTest.kt
│           │                           ├── PostgreSqlParserDmlTest.kt
│           │                           └── PostgreSqlProcessParserTest.kt
│           └── resources/
│               └── log4j2.xml
├── superior-presto-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── presto/
│       │   │                           └── antlr4/
│       │   │                               └── PrestoSqlBase.g4
│       │   ├── java/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── presto/
│       │   │                           └── CaseInsensitiveStream.java
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── presto/
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── PrestoSqlAntlr4Visitor.kt
│       │                               └── PrestoSqlHelper.kt
│       └── test/
│           ├── kotlin/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── presto/
│           │                           └── PrestoSqlParserTest.kt
│           └── resources/
│               └── log4j2.xml
├── superior-redshift-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── redshift/
│       │   │                           └── antlr4/
│       │   │                               ├── RedshiftLexer.g4
│       │   │                               └── RedshiftParser.g4
│       │   ├── java/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── redshift/
│       │   │                           └── antlr4/
│       │   │                               ├── LexerDispatchingErrorListener.java
│       │   │                               ├── ParserDispatchingErrorListener.java
│       │   │                               ├── RedshiftLexerBase.java
│       │   │                               └── RedshiftParserBase.java
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── postgre/
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── RedshiftSqlAntlr4Visitor.kt
│       │                               ├── RedshiftSqlHelper.kt
│       │                               ├── relational/
│       │                               │   └── CreatePartitionTable.kt
│       │                               └── type/
│       │                                   ├── BooleanType.kt
│       │                                   ├── JsonType.kt
│       │                                   ├── datetime.kt
│       │                                   ├── numeric.kt
│       │                                   └── string.kt
│       └── test/
│           ├── java/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── postgre/
│           │                           ├── RedshiftSqlParserDdlTest.kt
│           │                           ├── RedshiftSqlParserDmlTest.kt
│           │                           └── RedshiftSqlProcessParserTest.kt
│           └── resources/
│               └── log4j2.xml
├── superior-spark-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── spark/
│       │   │                           └── antlr4/
│       │   │                               ├── SparkSqlLexer.g4
│       │   │                               ├── SparkSqlParser.g4
│       │   │                               ├── SparkStreamSqlLexer.g4
│       │   │                               └── SparkStreamSqlParser.g4
│       │   ├── java/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── spark/
│       │   │                           └── SparkSqlPostProcessor.java
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── spark/
│       │                               ├── AbstractSparkStreamSqlParser.kt
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── SparkSqlAntlr4Visitor.kt
│       │                               ├── SparkSqlHelper.kt
│       │                               ├── SparkStreamSqlAntlr4Visitor.kt
│       │                               ├── SparkStreamSqlHelper.kt
│       │                               └── relational/
│       │                                   ├── CallHelp.kt
│       │                                   ├── CreateFileView.kt
│       │                                   ├── CreateTempViewUsing.kt
│       │                                   ├── DataTunnelExpr.kt
│       │                                   ├── DataTunnelHelp.kt
│       │                                   ├── DistCpExpr.kt
│       │                                   ├── LoadData.kt
│       │                                   ├── MergeFileData.kt
│       │                                   ├── RefreshStatement.kt
│       │                                   └── cache.kt
│       └── test/
│           ├── kotlin/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── spark/
│           │                           ├── DeltaSqlExtensionsTest.kt
│           │                           ├── IcebergSqlExtensionsTest.kt
│           │                           ├── SparkSqlParserTest.kt
│           │                           └── SparkStreamSqlParserTest.kt
│           └── resources/
│               ├── demo.sql
│               └── log4j2.xml
├── superior-sqlserver-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── sqlserver/
│       │   │                           └── antlr4/
│       │   │                               ├── SqlServerLexer.g4
│       │   │                               └── SqlServerParser.g4
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── sqlserver/
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── SqlServerAntlr4Visitor.kt
│       │                               └── SqlServerHelper.kt
│       └── test/
│           ├── kotlin/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── sqlserver/
│           │                           ├── SqlServerParserDdlTest.kt
│           │                           └── SqlServerParserDmlTest.kt
│           └── resources/
│               └── log4j2.xml
├── superior-starrocks-parser/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── antlr4/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── starrocks/
│       │   │                           └── antlr4/
│       │   │                               ├── StarRocksLexer.g4
│       │   │                               └── StarRocksParser.g4
│       │   ├── java/
│       │   │   └── io/
│       │   │       └── github/
│       │   │           └── melin/
│       │   │               └── superior/
│       │   │                   └── parser/
│       │   │                       └── starrocks/
│       │   │                           ├── NodePosition.java
│       │   │                           ├── ParsingException.java
│       │   │                           ├── PostProcessListener.java
│       │   │                           └── SqlModeHelper.java
│       │   └── kotlin/
│       │       └── io/
│       │           └── github/
│       │               └── melin/
│       │                   └── superior/
│       │                       └── parser/
│       │                           └── starrocks/
│       │                               ├── AbstractSqlParser.kt
│       │                               ├── StarRocksAntlr4Visitor.kt
│       │                               ├── StarRocksHelper.kt
│       │                               └── relational/
│       │                                   ├── AlterRoutineLoad.kt
│       │                                   ├── CancelRefreshMaterializedView.kt
│       │                                   ├── CreateRoutineLoad.kt
│       │                                   ├── DropTask.kt
│       │                                   ├── PauseRoutineLoad.kt
│       │                                   ├── ResumeRoutineLoad.kt
│       │                                   ├── StopRoutineLoad.kt
│       │                                   └── SubmitTask.kt
│       └── test/
│           ├── kotlin/
│           │   └── io/
│           │       └── github/
│           │           └── melin/
│           │               └── superior/
│           │                   └── parser/
│           │                       └── starrocks/
│           │                           ├── StarRocksSqlParserDdlTest.kt
│           │                           ├── StarRocksSqlParserDmlTest.kt
│           │                           ├── StarRocksSqlParserLoadAndExportTest.kt
│           │                           └── StarRocksSqlParserRoutineLoadTest.kt
│           └── resources/
│               └── log4j2.xml
└── superior-trino-parser/
    ├── pom.xml
    └── src/
        ├── main/
        │   ├── antlr4/
        │   │   └── io/
        │   │       └── github/
        │   │           └── melin/
        │   │               └── superior/
        │   │                   └── parser/
        │   │                       └── trino/
        │   │                           └── antlr4/
        │   │                               └── TrinoSqlBase.g4
        │   ├── java/
        │   │   └── io/
        │   │       └── github/
        │   │           └── melin/
        │   │               └── superior/
        │   │                   └── parser/
        │   │                       └── trino/
        │   │                           └── CaseInsensitiveStream.java
        │   └── kotlin/
        │       └── io/
        │           └── github/
        │               └── melin/
        │                   └── superior/
        │                       └── parser/
        │                           └── trino/
        │                               ├── AbstractSqlParser.kt
        │                               ├── TrinoSqlAntlr4Visitor.kt
        │                               └── TrinoSqlHelper.kt
        └── test/
            ├── kotlin/
            │   └── io/
            │       └── github/
            │           └── melin/
            │               └── superior/
            │                   └── parser/
            │                       └── trino/
            │                           └── TrinoSqlParserTest.kt
            └── resources/
                └── log4j2.xml
Download .txt
SYMBOL INDEX (160 symbols across 23 files)

FILE: superior-common-parser/src/main/java/io/github/melin/superior/common/antlr4/AntlrCaches.java
  class AntlrCaches (line 9) | public class AntlrCaches {
    method AntlrCaches (line 19) | public AntlrCaches(ATN atn) {
    method installCaches (line 24) | public void installCaches(Parser parser) {
    method makeDecisionToDFA (line 28) | private DFA[] makeDecisionToDFA(ATN atn) {

FILE: superior-common-parser/src/main/java/io/github/melin/superior/common/antlr4/Origin.java
  class Origin (line 3) | public class Origin {
    method Origin (line 7) | public Origin(int line, int startPosition) {
    method getLine (line 12) | public int getLine() {
    method setLine (line 16) | public void setLine(int line) {
    method getStartPosition (line 20) | public int getStartPosition() {
    method setStartPosition (line 24) | public void setStartPosition(int startPosition) {

FILE: superior-common-parser/src/main/java/io/github/melin/superior/common/antlr4/ParseErrorListener.java
  class ParseErrorListener (line 7) | public class ParseErrorListener extends BaseErrorListener {
    method syntaxError (line 9) | @Override

FILE: superior-common-parser/src/main/java/io/github/melin/superior/common/antlr4/ParseException.java
  class ParseException (line 5) | public class ParseException extends RuntimeException {
    method ParseException (line 11) | public ParseException(String message, Origin start, Origin stop) {
    method ParseException (line 17) | public ParseException(String command, String message, Origin start, Or...
    method getMessage (line 24) | @Override
    method withCommand (line 53) | public ParseException withCommand(String cmd) {
    method getCommand (line 57) | public String getCommand() {
    method getStart (line 61) | public Origin getStart() {
    method getStop (line 65) | public Origin getStop() {

FILE: superior-common-parser/src/main/java/io/github/melin/superior/common/antlr4/ParserUtils.java
  class ParserUtils (line 9) | public class ParserUtils {
    method source (line 12) | public static String source(ParserRuleContext ctx) {
    method getString (line 18) | public static String getString(Token token) {
    method getString (line 22) | public static String getString(TerminalNode token) {
    method getInt (line 26) | public static int getInt(Token token) {
    method command (line 30) | public static String command(ParserRuleContext ctx) {
    method position (line 35) | public static Origin position(Token token) {
    method appendEscapedChar (line 39) | private static void appendEscapedChar(StringBuilder sb, char n) {
    method unescapeSQLString (line 69) | private static String unescapeSQLString(String b) {

FILE: superior-common-parser/src/main/java/io/github/melin/superior/common/antlr4/UpperCaseCharStream.java
  class UpperCaseCharStream (line 8) | public class UpperCaseCharStream implements CharStream {
    method UpperCaseCharStream (line 12) | public UpperCaseCharStream(CodePointCharStream wrapped) {
    method consume (line 16) | @Override
    method LA (line 21) | @Override
    method getText (line 31) | @Override
    method mark (line 40) | @Override
    method release (line 45) | @Override
    method index (line 50) | @Override
    method seek (line 55) | @Override
    method size (line 60) | @Override
    method getSourceName (line 65) | @Override

FILE: superior-oracle-parser/src/main/java/io/github/melin/superior/parser/oracle/antlr4/OracleLexerBase.java
  class OracleLexerBase (line 6) | public abstract class OracleLexerBase extends Lexer {
    method OracleLexerBase (line 9) | public OracleLexerBase(CharStream input) {
    method IsNewlineAtPos (line 14) | protected boolean IsNewlineAtPos(int pos) {

FILE: superior-oracle-parser/src/main/java/io/github/melin/superior/parser/oracle/antlr4/OracleParserBase.java
  class OracleParserBase (line 5) | public abstract class OracleParserBase extends Parser {
    method OracleParserBase (line 10) | public OracleParserBase(TokenStream input) {
    method isVersion12 (line 14) | public boolean isVersion12() {
    method setVersion12 (line 18) | public void setVersion12(boolean value) {
    method isVersion11 (line 22) | public boolean isVersion11() {
    method setVersion11 (line 26) | public void setVersion11(boolean value) {
    method isVersion10 (line 30) | public boolean isVersion10() {
    method setVersion10 (line 34) | public void setVersion10(boolean value) {

FILE: superior-postgres-parser/src/main/java/io/github/melin/superior/parser/postgre/antlr4/LexerDispatchingErrorListener.java
  class LexerDispatchingErrorListener (line 8) | public class LexerDispatchingErrorListener implements ANTLRErrorListener {
    method LexerDispatchingErrorListener (line 11) | public LexerDispatchingErrorListener(Lexer parent) {
    method syntaxError (line 15) | public void syntaxError(
    method reportAmbiguity (line 26) | public void reportAmbiguity(
    method reportAttemptingFullContext (line 38) | public void reportAttemptingFullContext(
    method reportContextSensitivity (line 44) | public void reportContextSensitivity(

FILE: superior-postgres-parser/src/main/java/io/github/melin/superior/parser/postgre/antlr4/ParserDispatchingErrorListener.java
  class ParserDispatchingErrorListener (line 8) | public class ParserDispatchingErrorListener implements ANTLRErrorListener {
    method ParserDispatchingErrorListener (line 11) | public ParserDispatchingErrorListener(Parser parent) {
    method syntaxError (line 15) | public void syntaxError(
    method reportAmbiguity (line 26) | public void reportAmbiguity(
    method reportAttemptingFullContext (line 38) | public void reportAttemptingFullContext(
    method reportContextSensitivity (line 44) | public void reportContextSensitivity(

FILE: superior-postgres-parser/src/main/java/io/github/melin/superior/parser/postgre/antlr4/PostgreSqlLexerBase.java
  class PostgreSqlLexerBase (line 8) | public abstract class PostgreSqlLexerBase extends Lexer {
    method PostgreSqlLexerBase (line 11) | protected PostgreSqlLexerBase(CharStream input) {
    method pushTag (line 15) | public void pushTag() {
    method isTag (line 19) | public boolean isTag() {
    method popTag (line 23) | public void popTag() {
    method checkLA (line 27) | public boolean checkLA(int c) {
    method charIsLetter (line 31) | public boolean charIsLetter() {
    method HandleNumericFail (line 35) | public void HandleNumericFail() {
    method HandleLessLessGreaterGreater (line 40) | public void HandleLessLessGreaterGreater() {
    method UnterminatedBlockCommentDebugAssert (line 45) | public void UnterminatedBlockCommentDebugAssert() {
    method CheckIfUtf32Letter (line 49) | public boolean CheckIfUtf32Letter() {

FILE: superior-postgres-parser/src/main/java/io/github/melin/superior/parser/postgre/antlr4/PostgreSqlParserBase.java
  class PostgreSqlParserBase (line 8) | public abstract class PostgreSqlParserBase extends Parser {
    method PostgreSqlParserBase (line 10) | public PostgreSqlParserBase(TokenStream input) {
    method GetParsedSqlTree (line 14) | ParserRuleContext GetParsedSqlTree(String script, int line) {
    method ParseRoutineBody (line 20) | public void ParseRoutineBody(PostgreSqlParser.Createfunc_opt_listConte...
    method TrimQuotes (line 65) | private String TrimQuotes(String s) {
    method unquote (line 69) | public String unquote(String s) {
    method GetRoutineBodyString (line 82) | public String GetRoutineBodyString(PostgreSqlParser.SconstContext rule) {
    method getPostgreSQLParser (line 98) | public PostgreSqlParser getPostgreSQLParser(String script) {

FILE: superior-presto-parser/src/main/java/io/github/melin/superior/parser/presto/CaseInsensitiveStream.java
  class CaseInsensitiveStream (line 20) | public class CaseInsensitiveStream implements CharStream {
    method CaseInsensitiveStream (line 23) | public CaseInsensitiveStream(CharStream stream) {
    method getText (line 27) | @Override
    method consume (line 32) | @Override
    method LA (line 37) | @Override
    method mark (line 50) | @Override
    method release (line 55) | @Override
    method index (line 60) | @Override
    method seek (line 65) | @Override
    method size (line 70) | @Override
    method getSourceName (line 75) | @Override

FILE: superior-redshift-parser/src/main/java/io/github/melin/superior/parser/redshift/antlr4/LexerDispatchingErrorListener.java
  class LexerDispatchingErrorListener (line 8) | public class LexerDispatchingErrorListener implements ANTLRErrorListener {
    method LexerDispatchingErrorListener (line 11) | public LexerDispatchingErrorListener(Lexer parent) {
    method syntaxError (line 15) | public void syntaxError(
    method reportAmbiguity (line 26) | public void reportAmbiguity(
    method reportAttemptingFullContext (line 38) | public void reportAttemptingFullContext(
    method reportContextSensitivity (line 44) | public void reportContextSensitivity(

FILE: superior-redshift-parser/src/main/java/io/github/melin/superior/parser/redshift/antlr4/ParserDispatchingErrorListener.java
  class ParserDispatchingErrorListener (line 8) | public class ParserDispatchingErrorListener implements ANTLRErrorListener {
    method ParserDispatchingErrorListener (line 11) | public ParserDispatchingErrorListener(Parser parent) {
    method syntaxError (line 15) | public void syntaxError(
    method reportAmbiguity (line 26) | public void reportAmbiguity(
    method reportAttemptingFullContext (line 38) | public void reportAttemptingFullContext(
    method reportContextSensitivity (line 44) | public void reportContextSensitivity(

FILE: superior-redshift-parser/src/main/java/io/github/melin/superior/parser/redshift/antlr4/RedshiftLexerBase.java
  class RedshiftLexerBase (line 8) | public abstract class RedshiftLexerBase extends Lexer {
    method RedshiftLexerBase (line 11) | protected RedshiftLexerBase(CharStream input) {
    method pushTag (line 15) | public void pushTag() {
    method isTag (line 19) | public boolean isTag() {
    method popTag (line 23) | public void popTag() {
    method checkLA (line 27) | public boolean checkLA(int c) {
    method charIsLetter (line 31) | public boolean charIsLetter() {
    method HandleNumericFail (line 35) | public void HandleNumericFail() {
    method HandleLessLessGreaterGreater (line 40) | public void HandleLessLessGreaterGreater() {
    method UnterminatedBlockCommentDebugAssert (line 45) | public void UnterminatedBlockCommentDebugAssert() {
    method CheckIfUtf32Letter (line 49) | public boolean CheckIfUtf32Letter() {

FILE: superior-redshift-parser/src/main/java/io/github/melin/superior/parser/redshift/antlr4/RedshiftParserBase.java
  class RedshiftParserBase (line 8) | public abstract class RedshiftParserBase extends Parser {
    method RedshiftParserBase (line 10) | public RedshiftParserBase(TokenStream input) {
    method GetParsedSqlTree (line 14) | ParserRuleContext GetParsedSqlTree(String script, int line) {
    method ParseRoutineBody (line 20) | public void ParseRoutineBody(RedshiftParser.Createfunc_opt_listContext...
    method TrimQuotes (line 63) | private String TrimQuotes(String s) {
    method unquote (line 67) | public String unquote(String s) {
    method GetRoutineBodyString (line 80) | public String GetRoutineBodyString(RedshiftParser.SconstContext rule) {
    method getPostgreSQLParser (line 96) | public RedshiftParser getPostgreSQLParser(String script) {

FILE: superior-spark-parser/src/main/java/io/github/melin/superior/parser/spark/SparkSqlPostProcessor.java
  class SparkSqlPostProcessor (line 10) | public class SparkSqlPostProcessor extends SparkSqlParserBaseListener {
    method exitQuotedIdentifier (line 13) | @Override
    method exitNonReserved (line 31) | @Override

FILE: superior-starrocks-parser/src/main/java/io/github/melin/superior/parser/starrocks/NodePosition.java
  class NodePosition (line 9) | public class NodePosition implements Serializable {
    method NodePosition (line 23) | public NodePosition(TerminalNode node) {
    method NodePosition (line 27) | public NodePosition(Token token) {
    method NodePosition (line 31) | public NodePosition(Token start, Token end) {
    method NodePosition (line 35) | public NodePosition(int line, int col) {
    method NodePosition (line 39) | public NodePosition(int line, int col, int endLine, int endCol) {
    method getLine (line 46) | public int getLine() {
    method getCol (line 50) | public int getCol() {
    method getEndLine (line 54) | public int getEndLine() {
    method getEndCol (line 58) | public int getEndCol() {
    method isZero (line 62) | public boolean isZero() {

FILE: superior-starrocks-parser/src/main/java/io/github/melin/superior/parser/starrocks/ParsingException.java
  class ParsingException (line 7) | public class ParsingException extends RuntimeException {
    method ParsingException (line 13) | public ParsingException(String detailMsg, NodePosition pos) {
    method ParsingException (line 20) | public ParsingException(String formatString, Object... args) {
    method getMessage (line 24) | @Override

FILE: superior-starrocks-parser/src/main/java/io/github/melin/superior/parser/starrocks/PostProcessListener.java
  class PostProcessListener (line 8) | public class PostProcessListener extends StarRocksParserBaseListener {
    method PostProcessListener (line 13) | public PostProcessListener(int maxTokensNum, int maxExprChildCount) {
    method visitTerminal (line 18) | @Override
    method exitExpressionList (line 28) | @Override
    method exitExpressionsWithDefault (line 43) | @Override
    method exitInsertStatement (line 56) | @Override

FILE: superior-starrocks-parser/src/main/java/io/github/melin/superior/parser/starrocks/SqlModeHelper.java
  class SqlModeHelper (line 3) | public class SqlModeHelper {

FILE: superior-trino-parser/src/main/java/io/github/melin/superior/parser/trino/CaseInsensitiveStream.java
  class CaseInsensitiveStream (line 20) | public class CaseInsensitiveStream implements CharStream {
    method CaseInsensitiveStream (line 23) | public CaseInsensitiveStream(CharStream stream) {
    method getText (line 27) | @Override
    method consume (line 32) | @Override
    method LA (line 37) | @Override
    method mark (line 50) | @Override
    method release (line 55) | @Override
    method index (line 60) | @Override
    method seek (line 65) | @Override
    method size (line 70) | @Override
    method getSourceName (line 75) | @Override
Condensed preview — 274 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,665K chars).
[
  {
    "path": ".gitignore",
    "chars": 135,
    "preview": "# Created by .ignore support plugin (hsz.mobi)\ntarget\n.idea\nsuperior-sql-parser.iml\nmetastore_db\nderby.log\n.DS_Store\ngen"
  },
  {
    "path": "LICENSE",
    "chars": 11344,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "README.md",
    "chars": 4891,
    "preview": "## 介绍\n\n基于 antlr4 的多种数据库SQL解析器,获取SQL中元数据,可用于数据平台产品中的多个场景:ddl语句提取元数据、sql 权限校验、表级血缘、sql语法校验等场景。支持spark、flink、gauss、starrock"
  },
  {
    "path": "pom.xml",
    "chars": 12668,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "superior-appjar-parser/pom.xml",
    "chars": 811,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "superior-appjar-parser/src/main/antlr4/io/github/melin/superior/parser/job/antlr4/AppJarLexer.g4",
    "chars": 1976,
    "preview": "lexer grammar AppJarLexer;\n\nchannels { DCSTREAMCOMMENT, ERRORCHANNEL }\n\n// SKIP\n\nSPACE:                               [ "
  },
  {
    "path": "superior-appjar-parser/src/main/antlr4/io/github/melin/superior/parser/job/antlr4/AppJarParser.g4",
    "chars": 1140,
    "preview": "parser grammar AppJarParser;\n\noptions { tokenVocab=AppJarLexer; }\n\nrootx\n    : jobTasks? EOF\n    ;\n\njobTasks\n    : (jobT"
  },
  {
    "path": "superior-appjar-parser/src/main/kotlin/io/github/melin/superior/parser/appjar/AbstractJarParser.kt",
    "chars": 1179,
    "preview": "package io.github.melin.superior.parser.appjar\n\nimport io.github.melin.superior.common.antlr4.AntlrCaches\nimport io.gith"
  },
  {
    "path": "superior-appjar-parser/src/main/kotlin/io/github/melin/superior/parser/appjar/AppJarAntlr4Visitor.kt",
    "chars": 2958,
    "preview": "package io.github.melin.superior.parser.appjar\n\nimport com.github.melin.superior.sql.parser.util.CommonUtils\nimport io.g"
  },
  {
    "path": "superior-appjar-parser/src/main/kotlin/io/github/melin/superior/parser/appjar/AppJarHelper.kt",
    "chars": 3175,
    "preview": "package io.github.melin.superior.parser.appjar\n\nimport com.github.melin.superior.sql.parser.util.CommonUtils\nimport io.g"
  },
  {
    "path": "superior-appjar-parser/src/main/kotlin/io/github/melin/superior/parser/appjar/AppJarInfo.kt",
    "chars": 525,
    "preview": "package io.github.melin.superior.parser.appjar\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io.github.me"
  },
  {
    "path": "superior-appjar-parser/src/test/kotlin/io/github/melin/superior/parser/appjar/AppJarParserTest.kt",
    "chars": 13168,
    "preview": "package io.github.melin.superior.parser.appjar\n\nimport io.github.melin.superior.common.StatementType\nimport io.github.me"
  },
  {
    "path": "superior-appjar-parser/src/test/resources/log4j2.xml",
    "chars": 520,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Configuration>\n    <Appenders>\n        <Console name=\"Console\" target=\"SYSTEM_OU"
  },
  {
    "path": "superior-arithmetic-parser/pom.xml",
    "chars": 819,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "superior-arithmetic-parser/src/main/antlr4/io/github/melin/superior/parser/antlr4/arithmetic/Arithmetic.g4",
    "chars": 5605,
    "preview": "grammar Arithmetic;\n\n@members {\n    public boolean bracket_enbled = true;\n}\n\narithmetic: expression EOF;\n\nexpression\n   "
  },
  {
    "path": "superior-arithmetic-parser/src/main/kotlin/io/github/melin/superior/parser/arithmetic/AbstractArithParser.kt",
    "chars": 1208,
    "preview": "package io.github.melin.superior.parser.arithmetic\n\nimport io.github.melin.superior.common.antlr4.AntlrCaches\nimport io."
  },
  {
    "path": "superior-arithmetic-parser/src/main/kotlin/io/github/melin/superior/parser/arithmetic/ArithmeticAntlr4Visitor.kt",
    "chars": 1734,
    "preview": "package com.github.melin.superior.sql.parser.arithmetic\n\nimport io.github.melin.superior.common.SQLParserException\nimpor"
  },
  {
    "path": "superior-arithmetic-parser/src/main/kotlin/io/github/melin/superior/parser/arithmetic/ArithmeticHelper.kt",
    "chars": 2440,
    "preview": "package com.github.melin.superior.sql.parser.arithmetic\n\nimport io.github.melin.superior.common.antlr4.AntlrCaches\nimpor"
  },
  {
    "path": "superior-arithmetic-parser/src/main/kotlin/io/github/melin/superior/parser/arithmetic/Data.kt",
    "chars": 578,
    "preview": "package io.github.melin.superior.parser.arithmetic\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io.githu"
  },
  {
    "path": "superior-arithmetic-parser/src/test/kotlin/io/github/melin/superior/parser/arithmetic/ArithmetricParserTest.kt",
    "chars": 2097,
    "preview": "package io.github.melin.superior.parser.arithmetic\n\nimport com.github.melin.superior.sql.parser.arithmetic.ArithmeticHel"
  },
  {
    "path": "superior-arithmetic-parser/src/test/resources/log4j2.xml",
    "chars": 520,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Configuration>\n    <Appenders>\n        <Console name=\"Console\" target=\"SYSTEM_OU"
  },
  {
    "path": "superior-common-parser/pom.xml",
    "chars": 563,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "superior-common-parser/src/main/java/io/github/melin/superior/common/antlr4/AntlrCaches.java",
    "chars": 1150,
    "preview": "package io.github.melin.superior.common.antlr4;\n\nimport org.antlr.v4.runtime.Parser;\nimport org.antlr.v4.runtime.atn.ATN"
  },
  {
    "path": "superior-common-parser/src/main/java/io/github/melin/superior/common/antlr4/Origin.java",
    "chars": 554,
    "preview": "package io.github.melin.superior.common.antlr4;\n\npublic class Origin {\n    private int line;\n    private int startPositi"
  },
  {
    "path": "superior-common-parser/src/main/java/io/github/melin/superior/common/antlr4/ParseErrorListener.java",
    "chars": 629,
    "preview": "package io.github.melin.superior.common.antlr4;\n\nimport org.antlr.v4.runtime.BaseErrorListener;\nimport org.antlr.v4.runt"
  },
  {
    "path": "superior-common-parser/src/main/java/io/github/melin/superior/common/antlr4/ParseException.java",
    "chars": 1988,
    "preview": "package io.github.melin.superior.common.antlr4;\n\nimport org.apache.commons.lang3.StringUtils;\n\npublic class ParseExcepti"
  },
  {
    "path": "superior-common-parser/src/main/java/io/github/melin/superior/common/antlr4/ParserUtils.java",
    "chars": 4241,
    "preview": "package io.github.melin.superior.common.antlr4;\n\nimport org.antlr.v4.runtime.CharStream;\nimport org.antlr.v4.runtime.Par"
  },
  {
    "path": "superior-common-parser/src/main/java/io/github/melin/superior/common/antlr4/UpperCaseCharStream.java",
    "chars": 1430,
    "preview": "package io.github.melin.superior.common.antlr4;\n\nimport org.antlr.v4.runtime.CharStream;\nimport org.antlr.v4.runtime.Cod"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/AlterActionType.kt",
    "chars": 928,
    "preview": "package io.github.melin.superior.common\n\nimport java.io.Serializable\n\nenum class AlterActionType : Serializable {\n    SE"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/PrivilegeType.kt",
    "chars": 161,
    "preview": "package io.github.melin.superior.common\n\nenum class PrivilegeType {\n    READ,\n    WRITE,\n    ALTER,\n    DROP,\n    ADMIN,"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/SQLParserException.kt",
    "chars": 263,
    "preview": "package io.github.melin.superior.common\n\nclass SQLParserException : RuntimeException {\n    constructor(message: String, "
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/SqlType.kt",
    "chars": 264,
    "preview": "package io.github.melin.superior.common\n\nenum class SqlType(val desc: String) {\n    DML(\"Data Manipulation Language\"),\n "
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/StatementType.kt",
    "chars": 1822,
    "preview": "package io.github.melin.superior.common\n\nimport java.io.Serializable\n\n/** Created by libinsong on 2017/3/6. */\nenum clas"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/TableType.kt",
    "chars": 184,
    "preview": "package io.github.melin.superior.common\n\nenum class TableType {\n    HIVE,\n    MYSQL,\n    ORACLE,\n    STARROCKS,\n    POST"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/AnalyzeTable.kt",
    "chars": 429,
    "preview": "package io.github.melin.superior.common.relational\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io.githu"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/DefaultStatement.kt",
    "chars": 382,
    "preview": "package io.github.melin.superior.common.relational\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io.githu"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/FunctionId.kt",
    "chars": 1458,
    "preview": "package io.github.melin.superior.common.relational\n\nimport com.google.common.collect.Lists\nimport org.apache.commons.lan"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/ProcedureId.kt",
    "chars": 952,
    "preview": "package io.github.melin.superior.common.relational\n\nimport org.apache.commons.lang3.StringUtils\n\ndata class ProcedureId("
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/SchemaId.kt",
    "chars": 795,
    "preview": "package io.github.melin.superior.common.relational\n\nimport org.apache.commons.lang3.StringUtils\n\ndata class SchemaId(val"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/Statement.kt",
    "chars": 741,
    "preview": "package io.github.melin.superior.common.relational\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io.githu"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/TableId.kt",
    "chars": 1438,
    "preview": "package io.github.melin.superior.common.relational\n\nimport org.apache.commons.lang3.StringUtils\n\ndata class TableId(val "
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/abs/AbsDatabaseStatement.kt",
    "chars": 209,
    "preview": "package io.github.melin.superior.common.relational.abs\n\nimport io.github.melin.superior.common.relational.Statement\n\nabs"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/abs/AbsTableStatement.kt",
    "chars": 260,
    "preview": "package io.github.melin.superior.common.relational.abs\n\nimport io.github.melin.superior.common.relational.Statement\nimpo"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/alter/AlterAction.kt",
    "chars": 298,
    "preview": "package io.github.melin.superior.common.relational.alter\n\nimport io.github.melin.superior.common.AlterActionType\nimport "
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/alter/AlterActions.kt",
    "chars": 4095,
    "preview": "package io.github.melin.superior.common.relational.alter\n\nimport com.google.common.collect.Maps\nimport io.github.melin.s"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/alter/AlterDatabase.kt",
    "chars": 993,
    "preview": "package io.github.melin.superior.common.relational.alter\n\nimport io.github.melin.superior.common.*\nimport io.github.meli"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/alter/AlterDatabaseActions.kt",
    "chars": 545,
    "preview": "package io.github.melin.superior.common.relational.alter\n\nimport com.google.common.collect.Maps\nimport io.github.melin.s"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/alter/AlterMaterializedView.kt",
    "chars": 950,
    "preview": "package io.github.melin.superior.common.relational.alter\n\nimport io.github.melin.superior.common.*\nimport io.github.meli"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/alter/AlterTable.kt",
    "chars": 1163,
    "preview": "package io.github.melin.superior.common.relational.alter\n\nimport io.github.melin.superior.common.*\nimport io.github.meli"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/alter/AlterView.kt",
    "chars": 921,
    "preview": "package io.github.melin.superior.common.relational.alter\n\nimport io.github.melin.superior.common.*\nimport io.github.meli"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/alter/DeltaAlterActions.kt",
    "chars": 756,
    "preview": "package io.github.melin.superior.common.relational.alter\n\nimport io.github.melin.superior.common.AlterActionType\n\nclass "
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/alter/IcebergAlterActions.kt",
    "chars": 1059,
    "preview": "package io.github.melin.superior.common.relational.alter\n\nimport io.github.melin.superior.common.AlterActionType\n\ndata c"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/AddResourceStatement.kt",
    "chars": 687,
    "preview": "package io.github.melin.superior.common.relational.common\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/CallProcedure.kt",
    "chars": 952,
    "preview": "package io.github.melin.superior.common.relational.common\n\nimport com.google.common.collect.Sets\nimport io.github.melin."
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/CancelExport.kt",
    "chars": 568,
    "preview": "package io.github.melin.superior.common.relational.common\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/CommentStatement.kt",
    "chars": 601,
    "preview": "package io.github.melin.superior.common.relational.common\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/DescModel.kt",
    "chars": 3105,
    "preview": "package io.github.melin.superior.common.relational.common\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/ListResourceStatement.kt",
    "chars": 688,
    "preview": "package io.github.melin.superior.common.relational.common\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/ReSetStatement.kt",
    "chars": 479,
    "preview": "package io.github.melin.superior.common.relational.common\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/RefreshMaterializedView.kt",
    "chars": 705,
    "preview": "package io.github.melin.superior.common.relational.common\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/RemoveResourceStatement.kt",
    "chars": 693,
    "preview": "package io.github.melin.superior.common.relational.common\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/SetStatement.kt",
    "chars": 502,
    "preview": "package io.github.melin.superior.common.relational.common\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/ShowStatement.kt",
    "chars": 935,
    "preview": "package io.github.melin.superior.common.relational.common\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/SyncStatement.kt",
    "chars": 1823,
    "preview": "package io.github.melin.superior.common.relational.common\n\nimport com.google.common.collect.Maps\nimport io.github.melin."
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/common/UseStatement.kt",
    "chars": 1084,
    "preview": "package io.github.melin.superior.common.relational.common\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateCatalog.kt",
    "chars": 610,
    "preview": "package io.github.melin.superior.common.relational.create\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateDatabase.kt",
    "chars": 965,
    "preview": "package io.github.melin.superior.common.relational.create\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateFunction.kt",
    "chars": 1294,
    "preview": "package io.github.melin.superior.common.relational.create\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateMaterializedView.kt",
    "chars": 1002,
    "preview": "package io.github.melin.superior.common.relational.create\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateProcedure.kt",
    "chars": 1025,
    "preview": "package io.github.melin.superior.common.relational.create\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateSchema.kt",
    "chars": 577,
    "preview": "package io.github.melin.superior.common.relational.create\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateTable.kt",
    "chars": 2616,
    "preview": "package io.github.melin.superior.common.relational.create\n\nimport com.google.common.collect.Lists\nimport io.github.melin"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateTableAsSelect.kt",
    "chars": 1983,
    "preview": "package io.github.melin.superior.common.relational.create\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateTableLike.kt",
    "chars": 732,
    "preview": "package io.github.melin.superior.common.relational.create\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/create/CreateView.kt",
    "chars": 1069,
    "preview": "package io.github.melin.superior.common.relational.create\n\nimport io.github.melin.superior.common.PrivilegeType\nimport i"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/delta/OptimizeTable.kt",
    "chars": 578,
    "preview": "package io.github.melin.superior.common.relational.delta\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/delta/VacuumTable.kt",
    "chars": 574,
    "preview": "package io.github.melin.superior.common.relational.delta\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/dml/DeleteTable.kt",
    "chars": 780,
    "preview": "package io.github.melin.superior.common.relational.dml\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io.g"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/dml/InsertFiles.kt",
    "chars": 557,
    "preview": "package io.github.melin.superior.common.relational.dml\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io.g"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/dml/InsertMode.kt",
    "chars": 212,
    "preview": "package io.github.melin.superior.common.relational.dml\n\nimport java.io.Serializable\n\nenum class InsertMode : Serializabl"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/dml/InsertMultiTable.kt",
    "chars": 506,
    "preview": "package io.github.melin.superior.common.relational.dml\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io.g"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/dml/InsertTable.kt",
    "chars": 1300,
    "preview": "package io.github.melin.superior.common.relational.dml\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io.g"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/dml/MergeTable.kt",
    "chars": 593,
    "preview": "package io.github.melin.superior.common.relational.dml\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io.g"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/dml/QueryStmt.kt",
    "chars": 763,
    "preview": "package io.github.melin.superior.common.relational.dml\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io.g"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/dml/UpdateTable.kt",
    "chars": 609,
    "preview": "package io.github.melin.superior.common.relational.dml\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io.g"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/drop/DropCatalog.kt",
    "chars": 484,
    "preview": "package io.github.melin.superior.common.relational.drop\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io."
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/drop/DropDatabase.kt",
    "chars": 762,
    "preview": "package io.github.melin.superior.common.relational.drop\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io."
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/drop/DropFunction.kt",
    "chars": 612,
    "preview": "package io.github.melin.superior.common.relational.drop\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io."
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/drop/DropMaterializedView.kt",
    "chars": 676,
    "preview": "package io.github.melin.superior.common.relational.drop\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io."
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/drop/DropProcedure.kt",
    "chars": 559,
    "preview": "package io.github.melin.superior.common.relational.drop\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io."
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/drop/DropSchema.kt",
    "chars": 580,
    "preview": "package io.github.melin.superior.common.relational.drop\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io."
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/drop/DropSequence.kt",
    "chars": 711,
    "preview": "package io.github.melin.superior.common.relational.drop\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io."
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/drop/DropTable.kt",
    "chars": 715,
    "preview": "package io.github.melin.superior.common.relational.drop\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io."
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/drop/DropView.kt",
    "chars": 651,
    "preview": "package io.github.melin.superior.common.relational.drop\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io."
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/enums.kt",
    "chars": 215,
    "preview": "package io.github.melin.superior.common.relational\n\nenum class SortType {\n    ASC,\n    DESC,\n    UNKOWN\n}\n\nenum class Pa"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/io/AlterLoadTable.kt",
    "chars": 528,
    "preview": "package io.github.melin.superior.common.relational.io\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io.gi"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/io/CancelLoadTable.kt",
    "chars": 529,
    "preview": "package io.github.melin.superior.common.relational.io\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io.gi"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/io/ExportTable.kt",
    "chars": 1795,
    "preview": "package io.github.melin.superior.common.relational.io\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io.gi"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/io/LoadTable.kt",
    "chars": 552,
    "preview": "package io.github.melin.superior.common.relational.io\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io.gi"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/table/ColumnRel.kt",
    "chars": 1377,
    "preview": "package io.github.melin.superior.common.relational.table\n\ndata class ColumnRel(\n    val columnName: String,\n    val type"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/table/RepairTable.kt",
    "chars": 569,
    "preview": "package io.github.melin.superior.common.relational.table\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/relational/table/TruncateTable.kt",
    "chars": 747,
    "preview": "package io.github.melin.superior.common.relational.table\n\nimport io.github.melin.superior.common.PrivilegeType\nimport io"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/type/AbsDataTimeType.kt",
    "chars": 92,
    "preview": "package io.github.melin.superior.common.type\n\nabstract class AbsDataTimeType : AbsType() {}\n"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/type/AbsNumericType.kt",
    "chars": 158,
    "preview": "package io.github.melin.superior.common.type\n\nabstract class AbsNumericType : AbsType() {\n    var character: String? = n"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/type/AbsStringType.kt",
    "chars": 157,
    "preview": "package io.github.melin.superior.common.type\n\nabstract class AbsStringType : AbsType() {\n    var character: String? = nu"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/type/AbsType.kt",
    "chars": 159,
    "preview": "package io.github.melin.superior.common.type\n\nabstract class AbsType : Type {\n    override val alias: String? = null\n   "
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/type/Type.kt",
    "chars": 174,
    "preview": "package io.github.melin.superior.common.type\n\ninterface Type {\n    val name: String\n    val alias: String?\n    val alias"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/util/CommonUtils.kt",
    "chars": 2165,
    "preview": "package com.github.melin.superior.sql.parser.util\n\nimport org.antlr.v4.runtime.ParserRuleContext\nimport org.antlr.v4.run"
  },
  {
    "path": "superior-common-parser/src/main/kotlin/io/github/melin/superior/common/util/DateUtils.kt",
    "chars": 588,
    "preview": "package com.github.melin.superior.sql.parser.util\n\nimport java.time.DateTimeException\nimport java.time.LocalDateTime\nimp"
  },
  {
    "path": "superior-dameng-parser/pom.xml",
    "chars": 811,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "superior-dameng-parser/src/main/antlr4/io/github/melin/superior/parser/dameng/antlr4/DmSqlLexer.g4",
    "chars": 43959,
    "preview": "lexer grammar DmSqlLexer;\n\n\n// Keywords\n\nABORT:                                 'ABORT';\nABSOLUTE:                      "
  },
  {
    "path": "superior-dameng-parser/src/main/antlr4/io/github/melin/superior/parser/dameng/antlr4/DmSqlParser.g4",
    "chars": 143055,
    "preview": "parser grammar DmSqlParser;\n\noptions { tokenVocab=DmSqlLexer; }\n\n\ndmprogram :\n    sql_clauses (SEMI sql_clauses)* SEMI? "
  },
  {
    "path": "superior-dameng-parser/src/main/kotlin/io/github/melin/superior/parser/dameng/AbstractSqlParser.kt",
    "chars": 1178,
    "preview": "package io.github.melin.superior.parser.dameng\n\nimport io.github.melin.superior.common.antlr4.AntlrCaches\nimport io.gith"
  },
  {
    "path": "superior-dameng-parser/src/main/kotlin/io/github/melin/superior/parser/dameng/DmSqlAntlr4Visitor.kt",
    "chars": 10698,
    "preview": "package io.github.melin.superior.parser.dameng\n\nimport com.github.melin.superior.sql.parser.util.CommonUtils\nimport io.g"
  },
  {
    "path": "superior-dameng-parser/src/main/kotlin/io/github/melin/superior/parser/dameng/DmSqlHelper.kt",
    "chars": 4162,
    "preview": "package com.github.melin.superior.sql.parser.mysql\n\nimport com.github.melin.superior.sql.parser.util.CommonUtils\nimport "
  },
  {
    "path": "superior-dameng-parser/src/test/kotlin/io/github/melin/superior/parser/dameng/DmSqlParserDdlTest.kt",
    "chars": 5806,
    "preview": "package io.github.melin.superior.parser.dameng\n\nimport com.github.melin.superior.sql.parser.mysql.DmSqlHelper\nimport io."
  },
  {
    "path": "superior-dameng-parser/src/test/kotlin/io/github/melin/superior/parser/dameng/DmSqlParserDmlTest.kt",
    "chars": 8972,
    "preview": "package io.github.melin.superior.parser.dameng\n\nimport com.github.melin.superior.sql.parser.mysql.DmSqlHelper\nimport io."
  },
  {
    "path": "superior-dameng-parser/src/test/kotlin/io/github/melin/superior/parser/dameng/DmSqlProcedureParserTest.kt",
    "chars": 82,
    "preview": "package io.github.melin.superior.parser.dameng\n\nclass DmSqlProcedureParserTest {}\n"
  },
  {
    "path": "superior-dameng-parser/src/test/resources/insert.sql",
    "chars": 46838,
    "preview": "insert into dwd.dwd_d03_contract_det_s\nselect to_date('${yyyy-mm-dd}', 'yyyy-mm-dd')                                    "
  },
  {
    "path": "superior-dameng-parser/src/test/resources/log4j2.xml",
    "chars": 520,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Configuration>\n    <Appenders>\n        <Console name=\"Console\" target=\"SYSTEM_OU"
  },
  {
    "path": "superior-flink-parser/README.md",
    "chars": 1736,
    "preview": "### 介绍\n\n### 整库同步\n\n```sql\n-- 分布表,合并写入目标库中\nCREATE DATABASE IF NOT EXISTS flink_cdc_demos \nWITH (\n    'connector' = 'jdbc',"
  },
  {
    "path": "superior-flink-parser/pom.xml",
    "chars": 809,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "superior-flink-parser/src/main/antlr4/io/github/melin/superior/parser/flink/antlr4/FlinkSqlLexer.g4",
    "chars": 23101,
    "preview": "lexer grammar FlinkSqlLexer;\n\n// SKIP\n\nWHITE_SPACE       : (' ' | '\\t' | '\\r' | '\\n')                                   "
  },
  {
    "path": "superior-flink-parser/src/main/antlr4/io/github/melin/superior/parser/flink/antlr4/FlinkSqlParser.g4",
    "chars": 30612,
    "preview": "parser grammar FlinkSqlParser;\n\noptions { tokenVocab=FlinkSqlLexer; }\n\nsqlStatements\n    : singleStatement* EOF\n    ;\n\ns"
  },
  {
    "path": "superior-flink-parser/src/main/kotlin/io/github/melin/superior/parser/flink/AbstractSqlParser.kt",
    "chars": 1188,
    "preview": "package io.github.melin.superior.parser.flink\n\nimport io.github.melin.superior.common.antlr4.AntlrCaches\nimport io.githu"
  },
  {
    "path": "superior-flink-parser/src/main/kotlin/io/github/melin/superior/parser/flink/FlinkSqlAntlr4Visitor.kt",
    "chars": 16366,
    "preview": "package io.github.melin.superior.parser.flink\n\nimport com.github.melin.superior.sql.parser.util.CommonUtils\nimport io.gi"
  },
  {
    "path": "superior-flink-parser/src/main/kotlin/io/github/melin/superior/parser/flink/FlinkSqlHelper.kt",
    "chars": 4022,
    "preview": "package io.github.melin.superior.parser.flink\n\nimport com.github.melin.superior.sql.parser.util.CommonUtils\nimport io.gi"
  },
  {
    "path": "superior-flink-parser/src/test/kotlin/io/github/melin/superior/parser/flink/FlinkCheckSql.kt",
    "chars": 353,
    "preview": "package io.github.melin.superior.parser.flink\n\nimport org.junit.Test\n\nclass FlinkCheckSql {\n\n    @Test\n    fun selectSql"
  },
  {
    "path": "superior-flink-parser/src/test/kotlin/io/github/melin/superior/parser/flink/FlinkSqlParserDdlTest.kt",
    "chars": 7188,
    "preview": "package io.github.melin.superior.parser.flink\n\nimport io.github.melin.superior.common.relational.create.CreateTable\nimpo"
  },
  {
    "path": "superior-flink-parser/src/test/kotlin/io/github/melin/superior/parser/flink/FlinkSqlParserDmlTest.kt",
    "chars": 10153,
    "preview": "package io.github.melin.superior.parser.flink\n\nimport io.github.melin.superior.common.relational.common.AddResourceState"
  },
  {
    "path": "superior-flink-parser/src/test/resources/log4j2.xml",
    "chars": 520,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Configuration>\n    <Appenders>\n        <Console name=\"Console\" target=\"SYSTEM_OU"
  },
  {
    "path": "superior-mysql-parser/pom.xml",
    "chars": 809,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "superior-mysql-parser/src/main/antlr4/io/github/melin/superior/parser/mysql/antlr4/MySqlLexer.g4",
    "chars": 51739,
    "preview": "lexer grammar MySqlLexer;\n\nchannels {\n    MYSQLCOMMENT,\n    ERRORCHANNEL\n}\n\n// SKIP\n\nSPACE              : [ \\t\\r\\n]+    "
  },
  {
    "path": "superior-mysql-parser/src/main/antlr4/io/github/melin/superior/parser/mysql/antlr4/MySqlParser.g4",
    "chars": 94476,
    "preview": "/*\nMySQL (Positive Technologies) grammar\nThe MIT License (MIT).\nCopyright (c) 2015-2017, Ivan Kochurkin (kvanttt@gmail.c"
  },
  {
    "path": "superior-mysql-parser/src/main/kotlin/io/github/melin/superior/parser/mysql/AbstractSqlParser.kt",
    "chars": 1176,
    "preview": "package io.github.melin.superior.parser.mysql\n\nimport io.github.melin.superior.common.antlr4.AntlrCaches\nimport io.githu"
  },
  {
    "path": "superior-mysql-parser/src/main/kotlin/io/github/melin/superior/parser/mysql/MySqlAntlr4Visitor.kt",
    "chars": 24458,
    "preview": "package io.github.melin.superior.parser.mysql\n\nimport com.github.melin.superior.sql.parser.util.CommonUtils\nimport io.gi"
  },
  {
    "path": "superior-mysql-parser/src/main/kotlin/io/github/melin/superior/parser/mysql/MySqlHelper.kt",
    "chars": 4155,
    "preview": "package com.github.melin.superior.sql.parser.mysql\n\nimport com.github.melin.superior.sql.parser.util.CommonUtils\nimport "
  },
  {
    "path": "superior-mysql-parser/src/main/kotlin/io/github/melin/superior/parser/mysql/type/JsonType.kt",
    "chars": 175,
    "preview": "package io.github.melin.superior.parser.mysql.type\n\nimport io.github.melin.superior.common.type.AbsType\n\nclass JsonType "
  },
  {
    "path": "superior-mysql-parser/src/main/kotlin/io/github/melin/superior/parser/mysql/type/datetime.kt",
    "chars": 612,
    "preview": "package io.github.melin.superior.parser.mysql.type\n\nimport io.github.melin.superior.common.type.AbsDataTimeType\n\nclass D"
  },
  {
    "path": "superior-mysql-parser/src/main/kotlin/io/github/melin/superior/parser/mysql/type/numeric.kt",
    "chars": 2310,
    "preview": "package io.github.melin.superior.parser.mysql.type\n\nimport io.github.melin.superior.common.type.AbsNumericType\n\ndata cla"
  },
  {
    "path": "superior-mysql-parser/src/main/kotlin/io/github/melin/superior/parser/mysql/type/string.kt",
    "chars": 1696,
    "preview": "package io.github.melin.superior.parser.mysql.type\n\nimport io.github.melin.superior.common.type.AbsStringType\n\ndata clas"
  },
  {
    "path": "superior-mysql-parser/src/test/kotlin/io/github/melin/superior/parser/mysql/MySqlParserDdlTest.kt",
    "chars": 23219,
    "preview": "package io.github.melin.superior.parser.mysql\n\nimport com.github.melin.superior.sql.parser.mysql.MySqlHelper\nimport io.g"
  },
  {
    "path": "superior-mysql-parser/src/test/kotlin/io/github/melin/superior/parser/mysql/MySqlParserDmlTest.kt",
    "chars": 11680,
    "preview": "package io.github.melin.superior.parser.mysql\n\nimport com.github.melin.superior.sql.parser.mysql.MySqlHelper\nimport io.g"
  },
  {
    "path": "superior-mysql-parser/src/test/kotlin/io/github/melin/superior/parser/mysql/MySqlProcedureParserTest.kt",
    "chars": 2556,
    "preview": "package io.github.melin.superior.parser.mysql\n\nimport com.github.melin.superior.sql.parser.mysql.MySqlHelper\nimport io.g"
  },
  {
    "path": "superior-mysql-parser/src/test/resources/log4j2.xml",
    "chars": 520,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Configuration>\n    <Appenders>\n        <Console name=\"Console\" target=\"SYSTEM_OU"
  },
  {
    "path": "superior-oracle-parser/pom.xml",
    "chars": 812,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "superior-oracle-parser/src/main/antlr4/io/github/melin/superior/parser/oracle/antlr4/OracleLexer.g4",
    "chars": 119395,
    "preview": "/**\n * Oracle(c) PL/SQL 11g Parser\n *\n * Copyright (c) 2009-2011 Alexandre Porcelli <alexandre.porcelli@gmail.com>\n * Co"
  },
  {
    "path": "superior-oracle-parser/src/main/antlr4/io/github/melin/superior/parser/oracle/antlr4/OracleParser.g4",
    "chars": 238753,
    "preview": "/**\n * Oracle(c) PL/SQL 11g Parser\n *\n * Copyright (c) 2009-2011 Alexandre Porcelli <alexandre.porcelli@gmail.com>\n * Co"
  },
  {
    "path": "superior-oracle-parser/src/main/java/io/github/melin/superior/parser/oracle/antlr4/OracleLexerBase.java",
    "chars": 445,
    "preview": "package io.github.melin.superior.parser.oracle.antlr4;\n\nimport org.antlr.v4.runtime.CharStream;\nimport org.antlr.v4.runt"
  },
  {
    "path": "superior-oracle-parser/src/main/java/io/github/melin/superior/parser/oracle/antlr4/OracleParserBase.java",
    "chars": 809,
    "preview": "package io.github.melin.superior.parser.oracle.antlr4;\n\nimport org.antlr.v4.runtime.*;\n\npublic abstract class OraclePars"
  },
  {
    "path": "superior-oracle-parser/src/main/kotlin/io/github/melin/superior/parser/oracle/AbstractSqlParser.kt",
    "chars": 1182,
    "preview": "package io.github.melin.superior.parser.oracle\n\nimport io.github.melin.superior.common.antlr4.AntlrCaches\nimport io.gith"
  },
  {
    "path": "superior-oracle-parser/src/main/kotlin/io/github/melin/superior/parser/oracle/OracleSqlAntlr4Visitor.kt",
    "chars": 20893,
    "preview": "package io.github.melin.superior.parser.oracle\n\nimport com.github.melin.superior.sql.parser.util.CommonUtils\nimport io.g"
  },
  {
    "path": "superior-oracle-parser/src/main/kotlin/io/github/melin/superior/parser/oracle/OracleSqlHelper.kt",
    "chars": 4452,
    "preview": "package io.github.melin.superior.parser.oracle\n\nimport com.github.melin.superior.sql.parser.util.CommonUtils\nimport io.g"
  },
  {
    "path": "superior-oracle-parser/src/test/java/io/github/melin/superior/parser/oracle/OracleProcessParserTest.kt",
    "chars": 9202,
    "preview": "package io.github.melin.superior.parser.oracle\n\nimport io.github.melin.superior.common.StatementType\nimport io.github.me"
  },
  {
    "path": "superior-oracle-parser/src/test/java/io/github/melin/superior/parser/oracle/OracleSqlParserDdlTest.kt",
    "chars": 5595,
    "preview": "package io.github.melin.superior.parser.oracle\n\nimport io.github.melin.superior.common.StatementType\nimport io.github.me"
  },
  {
    "path": "superior-oracle-parser/src/test/java/io/github/melin/superior/parser/oracle/OracleSqlParserDmlTest.kt",
    "chars": 8401,
    "preview": "package io.github.melin.superior.parser.oracle\n\nimport io.github.melin.superior.common.StatementType\nimport io.github.me"
  },
  {
    "path": "superior-oracle-parser/src/test/resources/insert.sql",
    "chars": 46838,
    "preview": "insert into dwd.dwd_d03_contract_det_s\nselect to_date('${yyyy-mm-dd}', 'yyyy-mm-dd')                                    "
  },
  {
    "path": "superior-oracle-parser/src/test/resources/log4j2.xml",
    "chars": 520,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Configuration>\n    <Appenders>\n        <Console name=\"Console\" target=\"SYSTEM_OU"
  },
  {
    "path": "superior-postgres-parser/pom.xml",
    "chars": 815,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "superior-postgres-parser/src/main/antlr4/io/github/melin/superior/parser/postgre/antlr4/PostgreSqlLexer.g4",
    "chars": 32498,
    "preview": "/*\nbased on\nhttps://github.com/tunnelvisionlabs/antlr4-grammar-postgresql/blob/master/src/com/tunnelvisionlabs/postgresq"
  },
  {
    "path": "superior-postgres-parser/src/main/antlr4/io/github/melin/superior/parser/postgre/antlr4/PostgreSqlParser.g4",
    "chars": 109378,
    "preview": "parser grammar PostgreSqlParser;\n\n\noptions { tokenVocab = PostgreSqlLexer;\nsuperClass = PostgreSqlParserBase;\n}\n\n@header"
  },
  {
    "path": "superior-postgres-parser/src/main/java/io/github/melin/superior/parser/postgre/antlr4/LexerDispatchingErrorListener.java",
    "chars": 1908,
    "preview": "package io.github.melin.superior.parser.postgre.antlr4;\n\nimport java.util.BitSet;\nimport org.antlr.v4.runtime.*;\nimport "
  },
  {
    "path": "superior-postgres-parser/src/main/java/io/github/melin/superior/parser/postgre/antlr4/ParserDispatchingErrorListener.java",
    "chars": 1912,
    "preview": "package io.github.melin.superior.parser.postgre.antlr4;\n\nimport java.util.BitSet;\nimport org.antlr.v4.runtime.*;\nimport "
  },
  {
    "path": "superior-postgres-parser/src/main/java/io/github/melin/superior/parser/postgre/antlr4/PostgreSqlLexerBase.java",
    "chars": 1681,
    "preview": "package io.github.melin.superior.parser.postgre.antlr4;\n\nimport java.util.ArrayDeque;\nimport java.util.Deque;\nimport org"
  },
  {
    "path": "superior-postgres-parser/src/main/java/io/github/melin/superior/parser/postgre/antlr4/PostgreSqlParserBase.java",
    "chars": 4944,
    "preview": "package io.github.melin.superior.parser.postgre.antlr4;\n\nimport io.github.melin.superior.common.antlr4.UpperCaseCharStre"
  },
  {
    "path": "superior-postgres-parser/src/main/kotlin/io/github/melin/superior/parser/postgre/AbstractSqlParser.kt",
    "chars": 1200,
    "preview": "package io.github.melin.superior.parser.postgre\n\nimport io.github.melin.superior.common.antlr4.AntlrCaches\nimport io.git"
  },
  {
    "path": "superior-postgres-parser/src/main/kotlin/io/github/melin/superior/parser/postgre/PostgreSqlAntlr4Visitor.kt",
    "chars": 27632,
    "preview": "package io.github.melin.superior.parser.postgre\n\nimport com.github.melin.superior.sql.parser.util.CommonUtils\nimport com"
  },
  {
    "path": "superior-postgres-parser/src/main/kotlin/io/github/melin/superior/parser/postgre/PostgreSqlHelper.kt",
    "chars": 4138,
    "preview": "package io.github.melin.superior.parser.postgre\n\nimport com.github.melin.superior.sql.parser.util.CommonUtils\nimport io."
  },
  {
    "path": "superior-postgres-parser/src/main/kotlin/io/github/melin/superior/parser/postgre/relational/CreatePartitionTable.kt",
    "chars": 643,
    "preview": "package io.github.melin.superior.parser.postgre.relational\n\nimport io.github.melin.superior.common.PrivilegeType\nimport "
  },
  {
    "path": "superior-postgres-parser/src/main/kotlin/io/github/melin/superior/parser/postgre/type/BooleanType.kt",
    "chars": 223,
    "preview": "package io.github.melin.superior.parser.postgre.type\n\nimport io.github.melin.superior.common.type.AbsType\n\nclass Boolean"
  },
  {
    "path": "superior-postgres-parser/src/main/kotlin/io/github/melin/superior/parser/postgre/type/JsonType.kt",
    "chars": 177,
    "preview": "package io.github.melin.superior.parser.postgre.type\n\nimport io.github.melin.superior.common.type.AbsType\n\nclass JsonTyp"
  },
  {
    "path": "superior-postgres-parser/src/main/kotlin/io/github/melin/superior/parser/postgre/type/datetime.kt",
    "chars": 655,
    "preview": "package io.github.melin.superior.parser.postgre.type\n\nimport io.github.melin.superior.common.type.AbsDataTimeType\n\nclass"
  },
  {
    "path": "superior-postgres-parser/src/main/kotlin/io/github/melin/superior/parser/postgre/type/numeric.kt",
    "chars": 2407,
    "preview": "package io.github.melin.superior.parser.postgre.type\n\nimport io.github.melin.superior.common.type.AbsNumericType\n\ndata c"
  },
  {
    "path": "superior-postgres-parser/src/main/kotlin/io/github/melin/superior/parser/postgre/type/string.kt",
    "chars": 842,
    "preview": "package io.github.melin.superior.parser.postgre.type\n\nimport io.github.melin.superior.common.type.AbsStringType\n\ndata cl"
  },
  {
    "path": "superior-postgres-parser/src/test/java/io/github/melin/superior/parser/postgre/PostgreSqlParserDdlTest.kt",
    "chars": 11814,
    "preview": "package io.github.melin.superior.parser.postgre\n\nimport io.github.melin.superior.common.AlterActionType\nimport io.github"
  },
  {
    "path": "superior-postgres-parser/src/test/java/io/github/melin/superior/parser/postgre/PostgreSqlParserDmlTest.kt",
    "chars": 10864,
    "preview": "package io.github.melin.superior.parser.postgre\n\nimport io.github.melin.superior.common.StatementType\nimport io.github.m"
  },
  {
    "path": "superior-postgres-parser/src/test/java/io/github/melin/superior/parser/postgre/PostgreSqlProcessParserTest.kt",
    "chars": 12456,
    "preview": "package io.github.melin.superior.parser.postgre\n\nimport io.github.melin.superior.common.StatementType\nimport io.github.m"
  },
  {
    "path": "superior-postgres-parser/src/test/resources/log4j2.xml",
    "chars": 520,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Configuration>\n    <Appenders>\n        <Console name=\"Console\" target=\"SYSTEM_OU"
  },
  {
    "path": "superior-presto-parser/pom.xml",
    "chars": 811,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "superior-presto-parser/src/main/antlr4/io/github/melin/superior/parser/presto/antlr4/PrestoSqlBase.g4",
    "chars": 28526,
    "preview": "/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance "
  },
  {
    "path": "superior-presto-parser/src/main/java/io/github/melin/superior/parser/presto/CaseInsensitiveStream.java",
    "chars": 1882,
    "preview": "/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance "
  },
  {
    "path": "superior-presto-parser/src/main/kotlin/io/github/melin/superior/parser/presto/AbstractSqlParser.kt",
    "chars": 1210,
    "preview": "package io.github.melin.superior.parser.presto\n\nimport io.github.melin.superior.common.antlr4.AntlrCaches\nimport io.gith"
  },
  {
    "path": "superior-presto-parser/src/main/kotlin/io/github/melin/superior/parser/presto/PrestoSqlAntlr4Visitor.kt",
    "chars": 7261,
    "preview": "package io.github.melin.superior.parser.presto\n\nimport com.github.melin.superior.sql.parser.util.CommonUtils\nimport io.g"
  },
  {
    "path": "superior-presto-parser/src/main/kotlin/io/github/melin/superior/parser/presto/PrestoSqlHelper.kt",
    "chars": 4084,
    "preview": "package io.github.melin.superior.parser.presto\n\nimport com.github.melin.superior.sql.parser.util.CommonUtils\nimport io.g"
  },
  {
    "path": "superior-presto-parser/src/test/kotlin/io/github/melin/superior/parser/presto/PrestoSqlParserTest.kt",
    "chars": 4449,
    "preview": "package io.github.melin.superior.parser.presto\n\nimport io.github.melin.superior.common.StatementType\nimport io.github.me"
  },
  {
    "path": "superior-presto-parser/src/test/resources/log4j2.xml",
    "chars": 520,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Configuration>\n    <Appenders>\n        <Console name=\"Console\" target=\"SYSTEM_OU"
  },
  {
    "path": "superior-redshift-parser/pom.xml",
    "chars": 815,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "superior-redshift-parser/src/main/antlr4/io/github/melin/superior/parser/redshift/antlr4/RedshiftLexer.g4",
    "chars": 32405,
    "preview": "/*\nbased on\nhttps://github.com/tunnelvisionlabs/antlr4-grammar-postgresql/blob/master/src/com/tunnelvisionlabs/postgresq"
  },
  {
    "path": "superior-redshift-parser/src/main/antlr4/io/github/melin/superior/parser/redshift/antlr4/RedshiftParser.g4",
    "chars": 109788,
    "preview": "parser grammar RedshiftParser;\n\n\noptions { tokenVocab = RedshiftLexer;\n    superClass = RedshiftParserBase;\n}\n\n@header\n{"
  },
  {
    "path": "superior-redshift-parser/src/main/java/io/github/melin/superior/parser/redshift/antlr4/LexerDispatchingErrorListener.java",
    "chars": 1909,
    "preview": "package io.github.melin.superior.parser.redshift.antlr4;\n\nimport java.util.BitSet;\nimport org.antlr.v4.runtime.*;\nimport"
  },
  {
    "path": "superior-redshift-parser/src/main/java/io/github/melin/superior/parser/redshift/antlr4/ParserDispatchingErrorListener.java",
    "chars": 1913,
    "preview": "package io.github.melin.superior.parser.redshift.antlr4;\n\nimport java.util.BitSet;\nimport org.antlr.v4.runtime.*;\nimport"
  },
  {
    "path": "superior-redshift-parser/src/main/java/io/github/melin/superior/parser/redshift/antlr4/RedshiftLexerBase.java",
    "chars": 1672,
    "preview": "package io.github.melin.superior.parser.redshift.antlr4;\n\nimport java.util.ArrayDeque;\nimport java.util.Deque;\nimport or"
  },
  {
    "path": "superior-redshift-parser/src/main/java/io/github/melin/superior/parser/redshift/antlr4/RedshiftParserBase.java",
    "chars": 4875,
    "preview": "package io.github.melin.superior.parser.redshift.antlr4;\n\nimport io.github.melin.superior.common.antlr4.UpperCaseCharStr"
  },
  {
    "path": "superior-redshift-parser/src/main/kotlin/io/github/melin/superior/parser/postgre/AbstractSqlParser.kt",
    "chars": 1193,
    "preview": "package io.github.melin.superior.parser.postgre\n\nimport io.github.melin.superior.common.antlr4.AntlrCaches\nimport io.git"
  },
  {
    "path": "superior-redshift-parser/src/main/kotlin/io/github/melin/superior/parser/postgre/RedshiftSqlAntlr4Visitor.kt",
    "chars": 27353,
    "preview": "package io.github.melin.superior.parser.postgre\n\nimport com.github.melin.superior.sql.parser.util.CommonUtils\nimport com"
  },
  {
    "path": "superior-redshift-parser/src/main/kotlin/io/github/melin/superior/parser/postgre/RedshiftSqlHelper.kt",
    "chars": 4108,
    "preview": "package io.github.melin.superior.parser.postgre\n\nimport com.github.melin.superior.sql.parser.util.CommonUtils\nimport io."
  },
  {
    "path": "superior-redshift-parser/src/main/kotlin/io/github/melin/superior/parser/postgre/relational/CreatePartitionTable.kt",
    "chars": 643,
    "preview": "package io.github.melin.superior.parser.postgre.relational\n\nimport io.github.melin.superior.common.PrivilegeType\nimport "
  },
  {
    "path": "superior-redshift-parser/src/main/kotlin/io/github/melin/superior/parser/postgre/type/BooleanType.kt",
    "chars": 223,
    "preview": "package io.github.melin.superior.parser.postgre.type\n\nimport io.github.melin.superior.common.type.AbsType\n\nclass Boolean"
  },
  {
    "path": "superior-redshift-parser/src/main/kotlin/io/github/melin/superior/parser/postgre/type/JsonType.kt",
    "chars": 177,
    "preview": "package io.github.melin.superior.parser.postgre.type\n\nimport io.github.melin.superior.common.type.AbsType\n\nclass JsonTyp"
  },
  {
    "path": "superior-redshift-parser/src/main/kotlin/io/github/melin/superior/parser/postgre/type/datetime.kt",
    "chars": 655,
    "preview": "package io.github.melin.superior.parser.postgre.type\n\nimport io.github.melin.superior.common.type.AbsDataTimeType\n\nclass"
  }
]

// ... and 74 more files (download for full content)

About this extraction

This page contains the full source code of the melin/superior-sql-parser GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 274 files (2.4 MB), approximately 654.0k tokens, and a symbol index with 160 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!