001package gudusoft.gsqlparser.resolver; 002 003import gudusoft.gsqlparser.EAggregateType; 004import gudusoft.gsqlparser.EDataType; 005import gudusoft.gsqlparser.EExpressionType; 006import gudusoft.gsqlparser.EFunctionType; 007import gudusoft.gsqlparser.nodes.*; 008import gudusoft.gsqlparser.sqlenv.TSQLEnv; 009import gudusoft.gsqlparser.sqlenv.TSQLFunction; 010 011import java.util.ArrayList; 012 013public class TResolverHelpUtils { 014 015 public static ArrayList<String> searchTypedStruct(TSQLEnv sqlEnv, TResultColumn resultColumn){ 016 if (resultColumn == null) return null; 017 // find struct from return type of a function 018 019 if (resultColumn.getExpr().getExpressionType() != EExpressionType.function_t) return null; 020 TFunctionCall f = resultColumn.getExpr().getFunctionCall(); 021 TSQLFunction sqlFunction = sqlEnv.searchFunction(f.getFunctionName().toString()); 022 if (sqlFunction == null) return null; 023 TTypeName struct_t = null; 024 if ((sqlFunction.getReturnType().getDataType() == EDataType.array_t) 025 || (sqlFunction.getReturnType().getTypeOfList().getDataType() == EDataType.struct_t)){ 026 struct_t = sqlFunction.getReturnType().getTypeOfList(); 027 }else if (sqlFunction.getReturnType().getDataType() == EDataType.struct_t){ 028 struct_t = sqlFunction.getReturnType(); 029 } 030 if (struct_t == null) return null; 031 ArrayList<String> columnList = new ArrayList<>(); 032 for(int k=0;k<struct_t.getColumnDefList().size();k++){ 033 columnList.add(struct_t.getColumnDefList().getColumn(k).getColumnName().toString()); 034 } 035 036 return columnList; 037 038 // 以下从函数的参数中查找 struct 039 040// tableFunctionVisitor tv = new tableFunctionVisitor(); 041// resultColumn.acceptChildren(tv); 042// return tv.getTf(); 043 } 044 045} 046 047class tableFunctionVisitor extends TParseTreeVisitor { 048 TTableFunction tf = null; 049 050 public TTableFunction getTf() { 051 return tf; 052 } 053 054 public void preVisit(TTableFunction node){ 055 if (node.getFunctionType() == EFunctionType.struct_t){ 056 tf = node; 057 //System.out.print("find struct: "+node.getFunctionName().toString()+", type:"+node.getFunctionType()); 058 } 059 } 060}