001package gudusoft.gsqlparser.parser; 002 003import gudusoft.gsqlparser.EDbVendor; 004import gudusoft.gsqlparser.TBaseType; 005import gudusoft.gsqlparser.TGSqlParser; 006import gudusoft.gsqlparser.TSourceTokenList; 007import gudusoft.gsqlparser.TStatementList; 008 009/** 010 * Trino SQL parser implementation. 011 * 012 * <p><b>Implementation Status:</b> DELEGATION PHASE 013 * <ul> 014 * <li><b>Current:</b> Delegates to legacy TGSqlParser</li> 015 * <li><b>Future:</b> Will extract Trino-specific logic incrementally</li> 016 * </ul> 017 * 018 * @see SqlParser 019 * @see SqlParserFactory 020 * @since 3.2.0.0 021 */ 022public class TrinoSqlParser implements SqlParser { 023 024 private final EDbVendor vendor = EDbVendor.dbvtrino; 025 026 @Override 027 public EDbVendor getVendor() { 028 return vendor; 029 } 030 031 @Override 032 public SqlParseResult parse(ParserContext context) { 033 return delegateToLegacy(context, true); 034 } 035 036 @Override 037 public SqlParseResult tokenize(ParserContext context) { 038 return delegateToLegacy(context, false); 039 } 040 041 private SqlParseResult delegateToLegacy(ParserContext context, boolean fullParse) { 042 SqlParseResult.Builder resultBuilder = new SqlParseResult.Builder(); 043 044 try { 045 TGSqlParser legacyParser = new TGSqlParser(vendor); 046 transferContext(legacyParser, context); 047 048 long tokenStart = System.currentTimeMillis(); 049 legacyParser.tokenizeSqltext(); 050 resultBuilder.tokenizationTimeMs(System.currentTimeMillis() - tokenStart); 051 052 if (fullParse) { 053 long parseStart = System.currentTimeMillis(); 054 int result = legacyParser.parse(); 055 resultBuilder.parsingTimeMs(System.currentTimeMillis() - parseStart); 056 057 if (result != 0) { 058 resultBuilder.errorCode(result); 059 resultBuilder.errorMessage("Parsing failed: " + legacyParser.getErrormessage()); 060 } else { 061 resultBuilder.errorCode(0); 062 resultBuilder.errorMessage(""); 063 } 064 } else { 065 int result = legacyParser.getrawsqlstatements(); 066 if (result != 0) { 067 resultBuilder.errorCode(result); 068 resultBuilder.errorMessage("Tokenization failed: " + legacyParser.getErrormessage()); 069 } else { 070 resultBuilder.errorCode(0); 071 resultBuilder.errorMessage(""); 072 } 073 } 074 075 resultBuilder.sourceTokenList(legacyParser.sourcetokenlist); 076 resultBuilder.sqlStatements(legacyParser.sqlstatements); 077 resultBuilder.lexer(legacyParser.getFlexer()); 078 079 } catch (Exception e) { 080 resultBuilder.errorCode(1); 081 resultBuilder.errorMessage("Operation failed: " + e.getMessage()); 082 } 083 084 return resultBuilder.build(); 085 } 086 087 private void transferContext(TGSqlParser legacyParser, ParserContext context) { 088 if (context.getSqlText() != null && !context.getSqlText().isEmpty()) { 089 legacyParser.sqltext = context.getSqlText(); 090 } 091 if (context.getSqlFilename() != null && !context.getSqlFilename().isEmpty()) { 092 legacyParser.sqlfilename = context.getSqlFilename(); 093 } 094 095 legacyParser.setEnablePartialParsing(context.isEnablePartialParsing()); 096 legacyParser.setSinglePLBlock(context.isSinglePLBlock()); 097 legacyParser.setOnlyNeedRawParseTree(context.isOnlyNeedRawParseTree()); 098 099 if (context.getTeradataUtilityType() != null) { 100 legacyParser.setTeradataUtilityType(context.getTeradataUtilityType()); 101 } 102 if (context.getMetaDatabase() != null) { 103 legacyParser.setMetaDatabase(context.getMetaDatabase()); 104 } 105 if (context.getSqlEnv() != null) { 106 legacyParser.setSqlEnv(context.getSqlEnv()); 107 } 108 if (context.isDumpResolverLog()) { 109 TBaseType.DUMP_RESOLVER_LOG_TO_CONSOLE = true; 110 } 111 } 112 113 @Override 114 public String toString() { 115 return "TrinoSqlParser{vendor=" + vendor + "}"; 116 } 117}