001package gudusoft.gsqlparser.sqlenv;
002
003import gudusoft.gsqlparser.EDbVendor;
004import gudusoft.gsqlparser.EExpressionType;
005import gudusoft.gsqlparser.TCustomSqlStatement;
006import gudusoft.gsqlparser.TGSqlParser;
007import gudusoft.gsqlparser.dlineage.util.DlineageUtil;
008import gudusoft.gsqlparser.dlineage.util.Pair3;
009import gudusoft.gsqlparser.nodes.TColumnDefinition;
010import gudusoft.gsqlparser.nodes.TDeclareVariable;
011import gudusoft.gsqlparser.nodes.TDeclareVariableList;
012import gudusoft.gsqlparser.nodes.TFunctionCall;
013import gudusoft.gsqlparser.nodes.TObjectName;
014import gudusoft.gsqlparser.nodes.TParseTreeNode;
015import gudusoft.gsqlparser.nodes.TResultColumn;
016import gudusoft.gsqlparser.nodes.TTableElement;
017import gudusoft.gsqlparser.nodes.TTableElementList;
018import gudusoft.gsqlparser.nodes.TTypeName;
019import gudusoft.gsqlparser.nodes.TViewAliasItem;
020import gudusoft.gsqlparser.stmt.TCreateFunctionStmt;
021import gudusoft.gsqlparser.stmt.TCreateProcedureStmt;
022import gudusoft.gsqlparser.stmt.TCreateSchemaSqlStatement;
023import gudusoft.gsqlparser.stmt.TCreateTableSqlStatement;
024import gudusoft.gsqlparser.stmt.TCreateTriggerStmt;
025import gudusoft.gsqlparser.stmt.TCreateViewSqlStatement;
026import gudusoft.gsqlparser.stmt.TStoredProcedureSqlStatement;
027import gudusoft.gsqlparser.stmt.TUseDatabase;
028import gudusoft.gsqlparser.stmt.mssql.TMssqlCreateFunction;
029import gudusoft.gsqlparser.stmt.mssql.TMssqlDeclare;
030import gudusoft.gsqlparser.stmt.oracle.TPlsqlCreateFunction;
031import gudusoft.gsqlparser.stmt.oracle.TPlsqlCreatePackage;
032import gudusoft.gsqlparser.stmt.oracle.TPlsqlCreateProcedure;
033import gudusoft.gsqlparser.stmt.oracle.TPlsqlCreateTrigger;
034import gudusoft.gsqlparser.stmt.teradata.TTeradataCreateProcedure;
035import gudusoft.gsqlparser.util.SQLUtil;
036
037import java.io.ByteArrayInputStream;
038import java.io.IOException;
039import java.util.ArrayList;
040import java.util.List;
041import java.util.Properties;
042import java.util.Stack;
043
044public class TDDLSQLEnv extends TSQLEnv {
045
046    private String sql;
047
048    private TSQLEnv metadataSQLEnv;
049
050    private String globalDatabase = null;
051
052    private String globalSchema = null;
053
054    private boolean init = false;
055    
056    private Stack<TCustomSqlStatement> stmtStack = new Stack<TCustomSqlStatement>();
057
058    public boolean isInit() {
059        return init;
060    }
061
062    public TDDLSQLEnv(String defaultServer, String defaultDatabase, String defaultSchema, EDbVendor dbVendor, String sql) {
063        super(dbVendor);
064        if(!SQLUtil.isEmpty(defaultServer) && !defaultServer.equals(TSQLEnv.DEFAULT_SERVER_NAME)) {
065                        setDefaultServerName(defaultServer);
066                }
067                if(!SQLUtil.isEmpty(defaultDatabase) && !defaultDatabase.equals(TSQLEnv.DEFAULT_DB_NAME)) {
068                        setDefaultCatalogName(defaultDatabase);
069                }
070                if(!SQLUtil.isEmpty(defaultSchema) && !defaultSchema.equals(TSQLEnv.DEFAULT_SCHEMA_NAME)) {
071                        setDefaultSchemaName(defaultSchema);
072                }
073        this.sql = sql;
074    }
075
076    public TDDLSQLEnv(String defaultServer, String defaultDatabase, String defaultSchema, TSQLEnv metadataSQLEnv, EDbVendor dbVendor, String sql) {
077        super(dbVendor);
078        if(!SQLUtil.isEmpty(defaultServer) && !defaultServer.equals(TSQLEnv.DEFAULT_SERVER_NAME)) {
079                        setDefaultServerName(defaultServer);
080                }
081                if(!SQLUtil.isEmpty(defaultDatabase) && !defaultDatabase.equals(TSQLEnv.DEFAULT_DB_NAME)) {
082                        setDefaultCatalogName(defaultDatabase);
083                }
084                if(!SQLUtil.isEmpty(defaultSchema) && !defaultSchema.equals(TSQLEnv.DEFAULT_SCHEMA_NAME)) {
085                        setDefaultSchemaName(defaultSchema);
086                }
087        this.sql = sql;
088        this.metadataSQLEnv = metadataSQLEnv;
089        if(metadataSQLEnv!=null) {
090                this.setDefaultServerName(metadataSQLEnv.getDefaultServerName());
091        }
092    }
093
094    @Override
095    public void initSQLEnv() {
096        synchronized (this) {
097            if (sql == null || init)
098                return;
099            TGSqlParser sqlparser = new TGSqlParser(getDBVendor());
100            sqlparser.setSqlEnv(metadataSQLEnv);
101            sqlparser.sqltext = sql;
102            sqlparser.parse();
103            List<TCustomSqlStatement> stmts = new ArrayList<TCustomSqlStatement>();
104            if (sqlparser.sqlstatements != null) {
105                for (int j = 0; j < sqlparser.sqlstatements.size(); j++) {
106                    TCustomSqlStatement stmt = sqlparser.sqlstatements.get(j);
107                    extractDDLStmts(stmts, stmt);
108                }
109            }
110
111            if (!stmts.isEmpty()) {
112                for (int j = 0; j < stmts.size(); j++) {
113                    TCustomSqlStatement stmt = stmts.get(j);
114                    analyzeSQLEnv(stmt);
115                }
116                init = true;
117            }
118            stmts.clear();
119            sql = null;
120        }
121    }
122
123    private void extractDDLStmts(List<TCustomSqlStatement> stmts, TCustomSqlStatement stmt) {
124        if (stmt instanceof TUseDatabase || stmt instanceof TCreateSchemaSqlStatement
125                || stmt instanceof TCreateTableSqlStatement || stmt instanceof TMssqlDeclare
126                || stmt instanceof TStoredProcedureSqlStatement
127                || (stmt instanceof TMssqlCreateFunction
128                && ((TMssqlCreateFunction) stmt).getReturnTableDefinitions() != null)) {
129            stmts.add(stmt);
130        } else if (stmt instanceof TCreateViewSqlStatement) {
131            stmts.add(stmt);
132        } else if (stmt.getStatements() != null && stmt.getStatements().size() > 0) {
133            for (int i = 0; i < stmt.getStatements().size(); i++) {
134                extractDDLStmts(stmts, stmt.getStatements().get(i));
135            }
136        }
137    }
138
139    private void analyzeSQLEnv(TCustomSqlStatement stmt) {
140        stmtStack.push(stmt);
141        if (stmt instanceof TUseDatabase) {
142            TUseDatabase useDatabase = (TUseDatabase) stmt;
143            analyzeUseDatabase(useDatabase);
144        } else if (stmt instanceof TMssqlDeclare) {
145            TMssqlDeclare declare = (TMssqlDeclare) stmt;
146            analyzeMssqlDeclare(declare);
147        } else if (stmt instanceof TMssqlCreateFunction) {
148            TMssqlCreateFunction createFunction = (TMssqlCreateFunction) stmt;
149            analyzeMssqlCreateFunction(createFunction);
150        } else if (stmt instanceof TCreateSchemaSqlStatement) {
151            TCreateSchemaSqlStatement createSchema = (TCreateSchemaSqlStatement) stmt;
152            analyzeCreateSchema(createSchema);
153        } else if (stmt instanceof TCreateTableSqlStatement) {
154            TCreateTableSqlStatement createTable = (TCreateTableSqlStatement) stmt;
155            analyzeCreateTable(createTable);
156        } else if (stmt instanceof TCreateViewSqlStatement) {
157            TCreateViewSqlStatement createView = (TCreateViewSqlStatement) stmt;
158            analyzeCreateView(createView);
159        } else if (stmt instanceof TStoredProcedureSqlStatement) {
160            TStoredProcedureSqlStatement procedure = (TStoredProcedureSqlStatement) stmt;
161            analyzeStoredProcedureStmt(procedure);
162        }
163        stmtStack.pop();
164    }
165
166    private void analyzeStoredProcedureStmt(TStoredProcedureSqlStatement procedure) {
167        if (procedure instanceof TPlsqlCreatePackage) {
168            analyzeProcedure(procedure, ESQLDataObjectType.dotOraclePackage);
169            return;
170        }
171        if (procedure instanceof TCreateTriggerStmt) {
172            analyzeProcedure(procedure, ESQLDataObjectType.dotTrigger);
173            return;
174        }
175        if (procedure instanceof TCreateFunctionStmt) {
176            analyzeProcedure(procedure, ESQLDataObjectType.dotFunction);
177            return;
178        }
179        if (procedure instanceof TCreateProcedureStmt) {
180            analyzeProcedure(procedure, ESQLDataObjectType.dotProcedure);
181            return;
182        }
183    }
184
185    private void analyzeProcedure(TStoredProcedureSqlStatement procedure, ESQLDataObjectType type) {
186        TObjectName procedureName = getProcedureName(procedure);
187        if(procedureName == null){
188            return;
189        }
190        TSQLRoutine sqlProcedure = addSQLRoutineToSQLEnv(procedureName, type);
191        sqlProcedure.setDefinition(procedure.toString());
192        
193        if(procedure instanceof TPlsqlCreatePackage) {
194                TPlsqlCreatePackage oraclePackage = (TPlsqlCreatePackage)procedure;
195                if (oraclePackage.getDeclareStatements() != null) {
196                                for (int i = 0; i < oraclePackage.getDeclareStatements().size(); ++i) {
197                                        TCustomSqlStatement stmt = oraclePackage.getDeclareStatements().get(i);
198                                        if (stmt instanceof TPlsqlCreateTrigger) {
199                                                analyzePackageProcedure((TSQLOraclePackage) sqlProcedure, (TStoredProcedureSqlStatement)stmt,
200                                                                ESQLDataObjectType.dotTrigger);
201                                        }
202                                        if (stmt instanceof TPlsqlCreateFunction) {
203                                                analyzePackageProcedure((TSQLOraclePackage) sqlProcedure, (TStoredProcedureSqlStatement)stmt,
204                                                                ESQLDataObjectType.dotFunction);
205                                        }
206                                        if (stmt instanceof TPlsqlCreateProcedure) {
207                                                analyzePackageProcedure((TSQLOraclePackage) sqlProcedure, (TStoredProcedureSqlStatement)stmt,
208                                                                ESQLDataObjectType.dotProcedure);
209                                        }
210                                }
211                        }
212        }
213    }
214    
215    private void analyzePackageProcedure(TSQLOraclePackage oraclePackage, TStoredProcedureSqlStatement procedure, ESQLDataObjectType type) {
216        TObjectName procedureName = getProcedureName(procedure);
217        if(procedureName == null){
218            return;
219        }
220                TSQLProcedure object = (TSQLProcedure) oraclePackage
221                                .createSchemaObject(oraclePackage.getName() + "." + getQualifiedTableName(procedureName), type);
222        object.setDefinition(procedure.toString());
223    }
224
225
226    private TObjectName getProcedureName(TParseTreeNode procedureObject) {
227        if(procedureObject instanceof TTeradataCreateProcedure)
228        {
229            return ((TTeradataCreateProcedure)procedureObject).getProcedureName();
230        }
231        if(procedureObject instanceof TStoredProcedureSqlStatement)
232        {
233            return ((TStoredProcedureSqlStatement)procedureObject).getStoredProcedureName();
234        }
235        if(procedureObject instanceof TFunctionCall)
236        {
237            return ((TFunctionCall)procedureObject).getFunctionName();
238        }
239        return null;
240    }
241
242    private void analyzeCreateTable(TCreateTableSqlStatement createTable) {
243        if (createTable.getTables() != null && createTable.getTables().size() > 0) {
244            if (createTable.getColumnList() != null && createTable.getColumnList().size() > 0) {
245                TObjectName tableName = createTable.getTableName();
246                TSQLTable table = addTableToSQLEnv(tableName);
247                for (int i = 0; i < createTable.getColumnList().size(); i++) {
248                    TColumnDefinition column = createTable.getColumnList().getColumn(i);
249                    if (column != null && column.getColumnName() != null) {
250                        TObjectName columnName = column.getColumnName();
251                        addTableColumnToSQLEnv(table, columnName, column.getDatatype());
252                    }
253                }
254                table.setPriority(2);
255            } else if (createTable.getSubQuery() != null && createTable.getSubQuery().getResultColumnList() != null) {
256                if(createTable.getSubQuery().getResultColumnList().toString().indexOf("*") != -1) {
257                        return;
258                }
259                TSQLTable table = addTableToSQLEnv(createTable.getTargetTable().getTableName());
260                if (table.getColumns(true) == null || table.getColumns(true).isEmpty()) {
261                    for (int i = 0; i < createTable.getSubQuery().getResultColumnList().size(); i++) {
262                        TResultColumn resultColumn = createTable.getSubQuery().getResultColumnList().getResultColumn(i);
263                        addTableColumnToSQLEnv(table, getObjectName(resultColumn));
264                    }
265                }
266            }
267        }
268    }
269
270    private void analyzeCreateView(TCreateViewSqlStatement createView) {
271        if (createView.getViewName() != null) {
272            if (createView.getViewAliasClause() != null) {
273                TSQLTable table = addTableToSQLEnv(createView.getViewName());
274                table.setView(true);
275                for (int i = 0; i < createView.getViewAliasClause().getViewAliasItemList().size(); i++) {
276                    TViewAliasItem column = createView.getViewAliasClause().getViewAliasItemList().getViewAliasItem(i);
277                    if (column != null && column.getAlias() != null) {
278                        TObjectName columnName = column.getAlias();
279                        addTableColumnToSQLEnv(table, columnName);
280                    }
281                }
282                table.setPriority(2);
283            } else if (createView.getSubquery().getResultColumnList() != null) {
284                if(createView.getSubquery().getResultColumnList().toString().indexOf("*") != -1) {
285                        return;
286                }
287                                TSQLTable table = addTableToSQLEnv(createView.getViewName());
288                                table.setView(true);
289                                for (int i = 0; i < createView.getSubquery().getResultColumnList().size(); i++) {
290                                        TResultColumn resultColumn = createView.getSubquery().getResultColumnList().getResultColumn(i);
291                                        addTableColumnToSQLEnv(table, getObjectName(resultColumn));
292                                }
293            }
294        }
295    }
296
297    private TObjectName getObjectName(TResultColumn resultColumn) {
298        if (resultColumn.getAliasClause() != null && resultColumn.getAliasClause().getAliasName() != null) {
299            return resultColumn.getAliasClause().getAliasName();
300        }
301        if (resultColumn.getFieldAttr() != null) {
302            return resultColumn.getFieldAttr();
303        }
304        if (resultColumn.getExpr() != null
305                && resultColumn.getExpr().getExpressionType() == EExpressionType.simple_object_name_t) {
306            return resultColumn.getExpr().getObjectOperand();
307        } else if (!SQLUtil.isEmpty(resultColumn.getColumnNameOnly())) {
308            TObjectName objectName = new TObjectName();
309            objectName.setString(resultColumn.getColumnNameOnly());
310            return objectName;
311        } else {
312            return null;
313        }
314    }
315
316    private void analyzeUseDatabase(TUseDatabase useDatabase) {
317        TObjectName databaseName = useDatabase.getDatabaseName();
318
319        if (databaseName == null) {
320            return;
321        }
322
323        String qualifiedSchemaName = databaseName.toString();
324        if (getNumberOfPart(databaseName) == 1) {
325            qualifiedSchemaName = getCurrentDatabaseName() + "." + qualifiedSchemaName;
326        }
327        if (getSQLSchema(qualifiedSchemaName, false) != null) {
328            globalSchema = databaseName.toString();
329        } else {
330            String catalogName = databaseName.toString();
331            getSQLCatalog(catalogName, true);
332            globalDatabase = catalogName;
333        }
334    }
335
336    private int getNumberOfPart(TObjectName name) {
337        return SQLUtil.parseNames(name.toString()).size();
338    }
339
340    private int getNumberOfPart(String tableName) {
341        return SQLUtil.parseNames(tableName).size();
342    }
343
344    private void analyzeCreateSchema(TCreateSchemaSqlStatement createSchema) {
345        TObjectName schemaName = createSchema.getSchemaName();
346        if (schemaName != null) {
347            String qualifiedSchemaName = schemaName.toString();
348            if (getNumberOfPart(schemaName) == 1) {
349                qualifiedSchemaName = getCurrentDatabaseName() + "." + qualifiedSchemaName;
350            }
351            getSQLSchema(qualifiedSchemaName, true);
352        }
353    }
354
355    private String getCurrentDatabaseName() {
356        Pair3<String, String, String> info = fillSchemaInfo();
357        if(!SQLUtil.isEmpty(info.second)) {
358                return info.second;
359        }
360        if (!SQLUtil.isEmpty(globalDatabase)) {
361            return globalDatabase;
362        } else if (!SQLUtil.isEmpty(getDefaultCatalogName())) {
363            return getDefaultCatalogName();
364        } else
365            getSQLCatalog(DEFAULT_DB_NAME, true);
366        return DEFAULT_DB_NAME;
367    }
368
369    private String getCurrentSchemaName() {
370        Pair3<String, String, String> info = fillSchemaInfo();
371        if(!SQLUtil.isEmpty(info.third)) {
372                return info.third;
373        }
374        if (!SQLUtil.isEmpty(globalSchema)) {
375            return globalSchema;
376        } else if (!SQLUtil.isEmpty(getDefaultSchemaName())) {
377            return getDefaultSchemaName();
378        } else
379            return DEFAULT_SCHEMA_NAME;
380    }
381    
382        private Pair3<String, String, String> fillSchemaInfo() {
383                String server = null;
384                String database = null;
385                String schema = null;
386
387                TCustomSqlStatement stmt = DlineageUtil.getTopStmt(stmtStack.peek());
388                String sqlComment = null;
389                try {
390                        sqlComment = stmt.getCommentBeforeNode();
391                } catch (Exception e) {
392                        // e.printStackTrace();
393                }
394                if (!SQLUtil.isEmpty(sqlComment) && (sqlComment.indexOf("db") != -1 || sqlComment.indexOf("schema") != -1)) {
395                        Properties properties = new Properties();
396                        try {
397                                properties.load(
398                                                new ByteArrayInputStream(sqlComment.replace("--", "").trim().replace(",", "\n").getBytes()));
399                                if (SQLUtil.isEmpty(server) && properties.containsKey("db-instance")) {
400                                        server = properties.getProperty("db-instance");
401                                        if (!SQLUtil.isEmpty(server) && !server.equals(TSQLEnv.DEFAULT_SERVER_NAME)) {
402                                                if (SQLUtil.isEmpty(this.getDefaultServerName())
403                                                                || this.getDefaultServerName().equals(TSQLEnv.DEFAULT_SERVER_NAME)) {
404                                                        this.setDefaultServerName(server);
405                                                }
406                                        }
407                                }
408                                if (SQLUtil.isEmpty(database) && properties.containsKey("db")) {
409                                        database = properties.getProperty("db");
410                                        if (database.indexOf(".") != -1) {
411                                                String delimitedChar = TSQLEnv.delimitedChar(getDBVendor());
412                                                database = delimitedChar + SQLUtil.trimColumnStringQuote(database) + delimitedChar;
413                                        }
414                                }
415                                if (SQLUtil.isEmpty(schema) && properties.containsKey("schema")) {
416                                        schema = properties.getProperty("schema");
417                                        if (schema.indexOf(".") != -1) {
418                                                String delimitedChar = TSQLEnv.delimitedChar(getDBVendor());
419                                                schema = delimitedChar + SQLUtil.trimColumnStringQuote(schema) + delimitedChar;
420                                        }
421                                }
422                        } catch (IOException e) {
423                                e.printStackTrace();
424                        }
425                }
426
427                Pair3<String, String, String> info = new Pair3<String, String, String>(server, database, schema);
428                return info;
429        }
430
431
432    private void analyzeMssqlCreateFunction(TMssqlCreateFunction createFunction) {
433        if (createFunction.getReturnTableVaraible() != null && createFunction.getReturnTableDefinitions() != null) {
434            TObjectName tableName = createFunction.getReturnTableVaraible();
435            TSQLTable table = addTableToSQLEnv(tableName);
436
437            for (int j = 0; j < createFunction.getReturnTableDefinitions().size(); j++) {
438                TTableElement tableElement = createFunction.getReturnTableDefinitions().getTableElement(j);
439                TColumnDefinition column = tableElement.getColumnDefinition();
440                if (column != null && column.getColumnName() != null) {
441                    TObjectName columnName = column.getColumnName();
442                    addTableColumnToSQLEnv(table, columnName);
443                }
444            }
445        }
446    }
447
448    private void addTableColumnToSQLEnv(TSQLTable table, TObjectName columnName) {
449        if(columnName == null){
450            return;
451        }
452        String column = columnName.getColumnNameOnly();
453        if (!SQLUtil.isEmpty(column)) {
454            table.addColumn(column);
455        } else {
456            table.addColumn(columnName.toString());
457        }
458    }
459    
460    private void addTableColumnToSQLEnv(TSQLTable table, TObjectName columnName, TTypeName dataType) {
461        if(columnName == null){
462            return;
463        }
464        String column = columnName.getColumnNameOnly();
465        if (!SQLUtil.isEmpty(column)) {
466            table.addColumn(column, dataType);
467        } else {
468            table.addColumn(columnName.toString(), dataType);
469        }
470    }
471
472    private TSQLTable addTableToSQLEnv(TObjectName tableName) {
473        String qualifiedTableName = getQualifiedTableName(tableName);
474        if (getNumberOfPart(qualifiedTableName) == 1) {
475            if(!TSQLEnv.supportSchema(getDBVendor())){
476                qualifiedTableName = TSQLEnv.DEFAULT_DB_NAME + "." + getCurrentDatabaseName() + "." + qualifiedTableName;
477            }
478            else {
479                qualifiedTableName = getCurrentDatabaseName() + "." + getCurrentSchemaName() + "." + qualifiedTableName;
480            }
481        } else if (getNumberOfPart(qualifiedTableName) == 2) {
482            if(!TSQLEnv.supportSchema(getDBVendor())){
483                qualifiedTableName = TSQLEnv.DEFAULT_DB_NAME + "." + qualifiedTableName;
484            }
485            else {
486                qualifiedTableName = getCurrentDatabaseName() + "." + qualifiedTableName;
487            }
488        }
489        return addTable(qualifiedTableName, true);
490    }
491
492    private TSQLRoutine addSQLRoutineToSQLEnv(TObjectName procedureName, ESQLDataObjectType type) {
493        String qualifiedProcedureName = getQualifiedTableName(procedureName);
494        if (getNumberOfPart(qualifiedProcedureName) == 1) {
495            if(!TSQLEnv.supportSchema(getDBVendor())){
496                qualifiedProcedureName = TSQLEnv.DEFAULT_DB_NAME + "." + getCurrentDatabaseName() + "." + qualifiedProcedureName;
497            }
498            else {
499                qualifiedProcedureName = getCurrentDatabaseName() + "." + getCurrentSchemaName() + "." + qualifiedProcedureName;
500            }
501        } else if (getNumberOfPart(qualifiedProcedureName) == 2) {
502            if(!TSQLEnv.supportSchema(getDBVendor())){
503                qualifiedProcedureName = TSQLEnv.DEFAULT_DB_NAME + "." + qualifiedProcedureName;
504            }
505            else {
506                qualifiedProcedureName = getCurrentDatabaseName() + "." + qualifiedProcedureName;
507            }
508        }
509        return addSQLRoutine(qualifiedProcedureName, true, type);
510    }
511
512    private String getQualifiedTableName(TObjectName table) {
513        String tableName = table.toString();
514        if (metadataSQLEnv == null) {
515            return tableName;
516        }
517        List<String> segments = SQLUtil.parseNames(tableName);
518        if (segments.size() > 2) {
519            return tableName;
520        }
521        String schemaName = null;
522        if (segments.size() > 1) {
523            schemaName = segments.get(segments.size() - 2);
524        }
525        int occurrence = 0;
526        int maxPriority = -1;
527        String tableDatabase = null;
528        String tableSchema = null;
529        String simpleTableName = DlineageUtil.getSimpleTableName(tableName);
530        for (TSQLCatalog catalog : metadataSQLEnv.getCatalogList()) {
531            if (SQLUtil.isEmpty(schemaName)) {
532                for (TSQLSchema schema : catalog.getSchemaList()) {
533                    TSQLTable tsqlTable = schema.findTable(simpleTableName);
534                    if (tsqlTable != null) {
535                        occurrence += 1;
536                        if (tsqlTable.getPriority() > maxPriority) {
537                            tableDatabase = catalog.getName();
538                            tableSchema = schema.getName();
539                            maxPriority = tsqlTable.getPriority();
540                        }
541                    }
542                }
543                if (occurrence > 1) {
544                    break;
545                }
546            } else {
547                TSQLSchema schema = catalog.getSchema(schemaName, false);
548                if (schema != null) {
549                    TSQLTable tsqlTable = schema.findTable(simpleTableName);
550                    if (tsqlTable != null) {
551                        occurrence += 1;
552                        if (tsqlTable.getPriority() > maxPriority) {
553                            tableDatabase = catalog.getName();
554                            tableSchema = schema.getName();
555                            maxPriority = tsqlTable.getPriority();
556                        }
557                    }
558                }
559            }
560        }
561        if (occurrence == 1 || maxPriority > 0) {
562            StringBuilder qualifiedTableName = new StringBuilder();
563            if (tableDatabase != null && !TSQLEnv.DEFAULT_DB_NAME.equalsIgnoreCase(tableDatabase)) {
564                qualifiedTableName.append(tableDatabase).append(".");
565            }
566            if (tableSchema != null && !TSQLEnv.DEFAULT_SCHEMA_NAME.equalsIgnoreCase(tableSchema)) {
567                qualifiedTableName.append(tableSchema).append(".");
568            }
569            return qualifiedTableName.append(simpleTableName).toString();
570        }
571        return tableName;
572    }
573
574    private void analyzeMssqlDeclare(TMssqlDeclare declare) {
575        TDeclareVariableList variables = declare.getVariables();
576        if (variables == null) {
577            return;
578        }
579        for (int i = 0; i < variables.size(); i++) {
580            TDeclareVariable variable = variables.getDeclareVariable(i);
581            if (variable.getTableTypeDefinitions() == null || variable.getTableTypeDefinitions().size() == 0) {
582                continue;
583            }
584
585            TObjectName tableName = variable.getVariableName();
586            TSQLTable table = addTableToSQLEnv(tableName);
587
588            TTableElementList columns = variable.getTableTypeDefinitions();
589            for (int j = 0; j < columns.size(); j++) {
590                TTableElement tableElement = columns.getTableElement(j);
591                TColumnDefinition column = tableElement.getColumnDefinition();
592                if (column != null && column.getColumnName() != null) {
593                    TObjectName columnName = column.getColumnName();
594                    addTableColumnToSQLEnv(table, columnName);
595                }
596            }
597        }
598    }
599
600    public static void main(String[] args) {
601                TSQLEnv sqlenv = new TDDLSQLEnv("deawirddap001", "mio", "public", EDbVendor.dbvredshift, SQLUtil.getFileContent("C:\\Users\\KK\\Desktop\\ddl.sql"));
602                sqlenv.initSQLEnv();
603                System.out.println(sqlenv.toString());
604    }
605}