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}