|
@@ -181,435 +181,6 @@ public class EclResultSet implements ResultSet
|
|
|
warnings.add(new SQLWarning(ex.getMessage()));
|
|
|
throw new SQLException(ex);
|
|
|
}
|
|
|
-
|
|
|
-// try
|
|
|
-// {
|
|
|
-//
|
|
|
-// lastResult = new Object();
|
|
|
-//
|
|
|
-// this.statement = statement;
|
|
|
-// EclConnection connection = (EclConnection) statement.getConnection();
|
|
|
-// dbMetadata = connection.getDatabaseMetaData();
|
|
|
-// HashMap parameters = new HashMap();
|
|
|
-// rows = new ArrayList();
|
|
|
-//
|
|
|
-// SqlParser parser = new SqlParser();
|
|
|
-// parser.parse(query);
|
|
|
-//
|
|
|
-// int sqlreqtype = parser.getSqlType();
|
|
|
-//
|
|
|
-// //ArrayList<EclColumnMetaData> expectedretcolumns = new ArrayList();
|
|
|
-// List<EclColumnMetaData> expectedretcolumns = new ArrayList();
|
|
|
-// ArrayList<EclColumnMetaData> storeProcInParams = new ArrayList();
|
|
|
-// String hpccfilename = "";
|
|
|
-// String indextouse = null;
|
|
|
-// String indexposfield = null;
|
|
|
-// DFUFile indexfiletouse = null;
|
|
|
-// StringBuilder eclcode = new StringBuilder("");
|
|
|
-// int totalparamcount = 0;
|
|
|
-// if(sqlreqtype == SqlParser.SQL_TYPE_SELECT)
|
|
|
-// {}
|
|
|
-// else if(sqlreqtype == 9999)
|
|
|
-// {
|
|
|
-// hpccfilename = Utils.handleQuotedString(parser.getTableName());
|
|
|
-// if(!dbMetadata.tableExists("", hpccfilename))
|
|
|
-// throw new Exception("Invalid table found: " + hpccfilename);
|
|
|
-//
|
|
|
-// DFUFile dfufile = dbMetadata.getDFUFile(hpccfilename);
|
|
|
-//
|
|
|
-// //in future this might need to be a container of dfufile(s)
|
|
|
-// parser.verifySelectColumns(dfufile);
|
|
|
-//
|
|
|
-// expectedretcolumns = parser.getSelectColumns();
|
|
|
-//
|
|
|
-// totalparamcount = parser.getWhereClauseExpressionsCount();
|
|
|
-// if (totalparamcount > 0)
|
|
|
-// {
|
|
|
-// String [] paramnames = parser.getWhereClauseNames();
|
|
|
-// //String [] uniqueparameters = parser.getUniqueWhereClauseNames();
|
|
|
-// parser.populateParametrizedExpressions(inParameters);
|
|
|
-//
|
|
|
-// parameters.put("WHERECLAUSE", parser.getWhereClauseString());
|
|
|
-//
|
|
|
-// //Choose an index to use
|
|
|
-// if(!dfufile.isKeyFile() && dfufile.hasRelatedIndexes())
|
|
|
-// {
|
|
|
-// if(((ECLPreparedStatement)statement).isIndexSet())
|
|
|
-// {
|
|
|
-// indextouse = ((ECLPreparedStatement)statement).getIndexToUse();
|
|
|
-// }
|
|
|
-// else
|
|
|
-// {
|
|
|
-// List<String> relindexes = dfufile.getRelatedIndexesList();
|
|
|
-// int indexscore [][] = new int [dfufile.getRelatedIndexesCount()]
|
|
|
-// [INDEXSCORECRITERIA/*[FieldsInIndexCount][LeftMostKeyIndex][ColsKeyedcount]*/];
|
|
|
-// int highscore = Integer.MIN_VALUE;
|
|
|
-// boolean payloadIdxWithAtLeast1KeyedFieldFound = false;
|
|
|
-//
|
|
|
-// for (int indexcounter = 0; indexcounter < relindexes.size(); indexcounter++)
|
|
|
-// {
|
|
|
-// String indexname = relindexes.get(indexcounter);
|
|
|
-// DFUFile indexfile = dbMetadata.getDFUFile(indexname);
|
|
|
-//
|
|
|
-// if (indexfile!= null && indexfile.isKeyFile() && indexfile.hasValidIdxFilePosField())
|
|
|
-// {
|
|
|
-// for(int j = 0; j < expectedretcolumns.size(); j++)
|
|
|
-// {
|
|
|
-// if(indexfile.containsField(expectedretcolumns.get(j), true))
|
|
|
-// ++indexscore[indexcounter][NumberOfCommonParamInThisIndex];
|
|
|
-// }
|
|
|
-//
|
|
|
-// if (payloadIdxWithAtLeast1KeyedFieldFound && indexscore[indexcounter][NumberOfCommonParamInThisIndex] == 0)
|
|
|
-// break; //Don't bother with this index
|
|
|
-//
|
|
|
-// int localleftmostindex = Integer.MAX_VALUE;
|
|
|
-// Properties KeyColumns = indexfile.getKeyedColumns();
|
|
|
-//
|
|
|
-// if(KeyColumns!=null)
|
|
|
-// {
|
|
|
-// for (int i = 0; i < paramnames.length; i++)
|
|
|
-// {
|
|
|
-// String currentparam = paramnames[i];
|
|
|
-// if(KeyColumns.contains(currentparam))
|
|
|
-// {
|
|
|
-// ++indexscore[indexcounter][NumberofColsKeyedInThisIndex];
|
|
|
-// int paramindex = indexfile.getKeyColumnIndex(currentparam);
|
|
|
-// if (localleftmostindex>paramindex)
|
|
|
-// localleftmostindex = paramindex;
|
|
|
-// }
|
|
|
-// }
|
|
|
-// indexscore[indexcounter][LeftMostKeyIndexPosition] = localleftmostindex;
|
|
|
-// }
|
|
|
-//
|
|
|
-// if (indexscore[indexcounter][NumberOfCommonParamInThisIndex]==expectedretcolumns.size()
|
|
|
-// && indexscore[indexcounter][NumberofColsKeyedInThisIndex] > 0
|
|
|
-// && (!parser.whereClauseContainsOrOperator()))
|
|
|
-// payloadIdxWithAtLeast1KeyedFieldFound = true; // during scoring, give this priority
|
|
|
-// }
|
|
|
-// }
|
|
|
-//
|
|
|
-// for (int i = 0; i<dfufile.getRelatedIndexesCount(); i++)
|
|
|
-// {
|
|
|
-// if (indexscore[i][NumberOfCommonParamInThisIndex] == 0 || indexscore[i][NumberofColsKeyedInThisIndex] == 0) //does one imply the other?
|
|
|
-// continue; //not good enough
|
|
|
-//
|
|
|
-// if (payloadIdxWithAtLeast1KeyedFieldFound && indexscore[i][NumberOfCommonParamInThisIndex]<expectedretcolumns.size())
|
|
|
-// continue; //not good enough
|
|
|
-//
|
|
|
-// if (indexscore[i][NumberofColsKeyedInThisIndex] < parser.getWhereClauseExpressionsCount() && parser.whereClauseContainsOrOperator())
|
|
|
-// continue; //not so sure about this rule.
|
|
|
-//
|
|
|
-// //TODO if current is not payload index, check for fpos field if not found... discard???
|
|
|
-// //int localscore = ((indexscore[i][NumberOfCommonParamInThisIndex]/selectColumns.size()) * 5) -
|
|
|
-// int localscore = ((indexscore[i][NumberOfCommonParamInThisIndex]/expectedretcolumns.size()) * 5) -
|
|
|
-// (((indexscore[i][LeftMostKeyIndexPosition]/totalparamcount)-1) * 3) +
|
|
|
-// ((indexscore[i][NumberofColsKeyedInThisIndex]) * 2);
|
|
|
-//
|
|
|
-// if (highscore < localscore )
|
|
|
-// {
|
|
|
-// highscore = localscore;
|
|
|
-// indextouse = relindexes.get(i);
|
|
|
-//
|
|
|
-// if (payloadIdxWithAtLeast1KeyedFieldFound && indexscore[i][NumberOfCommonParamInThisIndex]==expectedretcolumns.size())
|
|
|
-// parameters.put("PAYLOADINDEX", "true");
|
|
|
-// else
|
|
|
-// parameters.remove("PAYLOADINDEX");
|
|
|
-// }
|
|
|
-// }
|
|
|
-// }
|
|
|
-//
|
|
|
-// if (indextouse != null)
|
|
|
-// {
|
|
|
-// indexfiletouse = dbMetadata.getDFUFile(indextouse);
|
|
|
-// indexposfield = indexfiletouse.getIdxFilePosField();
|
|
|
-//
|
|
|
-// Vector<String> keyed = new Vector<String>();
|
|
|
-// Vector<String> wild = new Vector<String>();
|
|
|
-//
|
|
|
-// //Create keyed and wild string
|
|
|
-// Properties keyedcols = indexfiletouse.getKeyedColumns();
|
|
|
-// for (int i = 1; i <= keyedcols.size(); i++)
|
|
|
-// {
|
|
|
-// String keyedcolname = (String)keyedcols.get(i);
|
|
|
-// if(parser.whereClauseContainsKey(keyedcolname))
|
|
|
-// keyed.add(" " + parser.getExpressionFromName(keyedcolname).toString() + " ");
|
|
|
-// else if (keyed.isEmpty())
|
|
|
-// wild.add(" " + keyedcolname + " ");
|
|
|
-// }
|
|
|
-//
|
|
|
-// StringBuilder keyedandwild = new StringBuilder();
|
|
|
-// if (parameters.containsKey("PAYLOADINDEX"))
|
|
|
-// {
|
|
|
-// if (keyed.size()>0)
|
|
|
-// {
|
|
|
-// keyedandwild.append("KEYED( ");
|
|
|
-// for (int i = 0 ; i < keyed.size(); i++)
|
|
|
-// {
|
|
|
-// keyedandwild.append(keyed.get(i));
|
|
|
-// if (i < keyed.size()-1)
|
|
|
-// keyedandwild.append(" AND ");
|
|
|
-// }
|
|
|
-// keyedandwild.append(" )");
|
|
|
-// }
|
|
|
-// if (wild.size()>0)
|
|
|
-// {
|
|
|
-// //TODO should I bother making sure there's a KEYED entry ?
|
|
|
-// for (int i = 0 ; i < wild.size(); i++)
|
|
|
-// {
|
|
|
-// keyedandwild.append(" and WILD( ");
|
|
|
-// keyedandwild.append(wild.get(i));
|
|
|
-// keyedandwild.append(" )");
|
|
|
-// }
|
|
|
-// }
|
|
|
-//
|
|
|
-// /*Properties nonkeyedcols = indexfiletouse.getNonKeyedColumns();
|
|
|
-// for (int i = 1; i <= nonkeyedcols.size(); i++)
|
|
|
-// {
|
|
|
-// String nonkeyedcolname = (String)nonkeyedcols.get(i);
|
|
|
-// //if(parameters.containsKey(nonkeyedcolname))
|
|
|
-// if(parser.whereClauseContainsKey(nonkeyedcolname))
|
|
|
-// //keyedandwild.append(" and ").append(nonkeyedcolname).append(" = \'").append(parameters.get(nonkeyedcolname)).append('\'');
|
|
|
-// keyedandwild.append(" and ").append(parser.getExpressionFromName(nonkeyedcolname).toString());
|
|
|
-// }*/
|
|
|
-//
|
|
|
-// keyedandwild.append(" and (").append(parser.getWhereClauseString()).append(" )");
|
|
|
-// }
|
|
|
-// else //non-payload just AND the keyed expressions
|
|
|
-// {
|
|
|
-// keyedandwild.append("( ");
|
|
|
-// keyedandwild.append(parser.getWhereClauseString());
|
|
|
-// keyedandwild.append(" )");
|
|
|
-//
|
|
|
-// /*if (keyed.size()>0)
|
|
|
-// {
|
|
|
-// keyedandwild.append("( ");
|
|
|
-// for (int i = 0 ; i < keyed.size(); i++)
|
|
|
-// {
|
|
|
-// keyedandwild.append(keyed.get(i));
|
|
|
-// if (i < keyed.size()-1)
|
|
|
-// keyedandwild.append(" AND ");
|
|
|
-// }
|
|
|
-// keyedandwild.append(" )");
|
|
|
-// }*/
|
|
|
-// }
|
|
|
-//
|
|
|
-// parameters.put("KEYEDWILD", keyedandwild.toString());
|
|
|
-// ((ECLPreparedStatement)statement).setIndexToUse(indexfiletouse.getFullyQualifiedName());
|
|
|
-// System.out.println("Found index to use: " + indextouse + " field: " + indexposfield);
|
|
|
-// }
|
|
|
-// else
|
|
|
-// System.out.println("No appropriate index found");
|
|
|
-// }
|
|
|
-// }
|
|
|
-// parameters.put("PARAMCOUNT", totalparamcount);
|
|
|
-//
|
|
|
-// if(dfufile.hasFileRecDef())
|
|
|
-// {
|
|
|
-// if (indextouse != null && indexposfield != null)
|
|
|
-// eclcode.append(dfufile.getFileRecDefwithIndexpos(dbMetadata.getDFUFile(indextouse).getFieldMetaData(indexposfield), "filerecstruct"));
|
|
|
-// else
|
|
|
-// eclcode.append(dfufile.getFileRecDef("filerecstruct"));
|
|
|
-// }
|
|
|
-// else
|
|
|
-// throw new Exception("Target HPCC file ("+hpccfilename+") does not contain ECL record definition");
|
|
|
-//
|
|
|
-// if(!dfufile.isKeyFile())
|
|
|
-// eclcode.append("fileds := DATASET(\'~").append(dfufile.getFullyQualifiedName()).append("\', filerecstruct,").append(dfufile.getFormat()).append("); ");
|
|
|
-// else
|
|
|
-// {
|
|
|
-// //eclcode.append("fileds := INDEX( filerecstruct, \'~").append(dfufile.getFullyQualifiedName()).append("\');");
|
|
|
-// eclcode.append("fileds := INDEX( ");
|
|
|
-// eclcode.append('{');
|
|
|
-// eclcode.append(dfufile.getKeyedFieldsAsDelmitedString(',', "filerecstruct"));
|
|
|
-// eclcode.append("},{");
|
|
|
-// eclcode.append(dfufile.getNonKeyedFieldsAsDelmitedString(',', "filerecstruct"));
|
|
|
-// eclcode.append("},");
|
|
|
-// eclcode.append("\'~").append(dfufile.getFullyQualifiedName()).append("\');");
|
|
|
-// }
|
|
|
-//
|
|
|
-// StringBuilder selectstruct = new StringBuilder(" selectstruct:=RECORD ");
|
|
|
-// String datasource = indextouse == null || parameters.containsKey("PAYLOADINDEX") ? "fileds" : "fetchedds";
|
|
|
-//
|
|
|
-// String scalarOutput = null;
|
|
|
-//
|
|
|
-// for (int i = 0; i < expectedretcolumns.size(); i++)
|
|
|
-// {
|
|
|
-// EclColumnMetaData col = expectedretcolumns.get(i);
|
|
|
-//
|
|
|
-// if (col.getColumnType() == EclColumnMetaData.COLUMN_TYPE_CONSTANT)
|
|
|
-// selectstruct.append(col.getEclType()).append(" ").append(col.getColumnName()).append(" := ").append(col.getConstantValue()).append("; ");
|
|
|
-//
|
|
|
-// else if (col.getColumnType() == EclColumnMetaData.COLUMN_TYPE_FNCTION)
|
|
|
-// {
|
|
|
-// if (col.getColumnName().equalsIgnoreCase("COUNT"))
|
|
|
-// {
|
|
|
-// parameters.put("COUNTFN", "TRUE");
|
|
|
-// selectstruct.append("countout := ");
|
|
|
-// if (parser.hasGroupByColumns())
|
|
|
-// {
|
|
|
-// selectstruct.append(col.getColumnName().toUpperCase()).append("( GROUP");
|
|
|
-// List<EclColumnMetaData> funccols = col.getFunccols();
|
|
|
-// //for count() only one param allowed
|
|
|
-// if (funccols.size() > 0)
|
|
|
-// {
|
|
|
-// String paramname = funccols.get(0).getColumnName();
|
|
|
-// if (!paramname.equals("*") && funccols.get(0).getColumnType() != EclColumnMetaData.COLUMN_TYPE_CONSTANT)
|
|
|
-// {
|
|
|
-// selectstruct.append(", ");
|
|
|
-// selectstruct.append(datasource);
|
|
|
-// selectstruct.append(".");
|
|
|
-// selectstruct.append(paramname);
|
|
|
-// selectstruct.append("<> \'\'");
|
|
|
-// }
|
|
|
-// }
|
|
|
-// selectstruct.append(" );");
|
|
|
-// }
|
|
|
-// else
|
|
|
-// selectstruct.append(" totalcount;");
|
|
|
-//
|
|
|
-// col.setSQLType(java.sql.Types.NUMERIC);
|
|
|
-// }
|
|
|
-// }
|
|
|
-// else
|
|
|
-// selectstruct.append(col.getEclType()).append(" ").append(col.getColumnName()).append(" := ").append(datasource).append(".").append(col.getColumnName()).append("; ");
|
|
|
-//
|
|
|
-// if (i == 0 && expectedretcolumns.size() == 1 )
|
|
|
-// parameters.put("SCALAROUTNAME", col.getColumnName());
|
|
|
-// }
|
|
|
-// selectstruct.append("END; ");
|
|
|
-//
|
|
|
-// parameters.put("SELECTSTRUCT", selectstruct.toString());
|
|
|
-//
|
|
|
-// //columns are base 1 indexed
|
|
|
-// resultMetadata = new EclResultsetMetadata(expectedretcolumns, hpccfilename);
|
|
|
-//
|
|
|
-// }
|
|
|
-// else if(sqlreqtype == SqlParser.SQL_TYPE_CALL)
|
|
|
-// {
|
|
|
-// hpccfilename = Utils.handleQuotedString(parser.getStoredProcName());
|
|
|
-// if(!dbMetadata.eclQueryExists("", hpccfilename))
|
|
|
-// throw new Exception("Invalid store procedure found");
|
|
|
-//
|
|
|
-// defaultEclQueryReturnDatasetName = dbMetadata.getdefaultECLQueryResultDatasetName("", hpccfilename);
|
|
|
-//
|
|
|
-// expectedretcolumns = dbMetadata.getStoredProcOutColumns("", hpccfilename);
|
|
|
-// storeProcInParams = dbMetadata.getStoredProcInColumns("",hpccfilename);
|
|
|
-// //columns are base 1 indexed
|
|
|
-// resultMetadata = new EclResultsetMetadata(expectedretcolumns, hpccfilename);
|
|
|
-//
|
|
|
-// String[] procInParamValues = parser.getStoredProcInParamVals();
|
|
|
-//
|
|
|
-// int paramcount = 0;
|
|
|
-// for (int i = 0; i < storeProcInParams.size(); i++)
|
|
|
-// {
|
|
|
-// if (procInParamValues[i].contains("${") || procInParamValues[i].equals("?"))
|
|
|
-// {
|
|
|
-// Object value = inParameters.get(new Integer(++paramcount));
|
|
|
-// parameters.put(storeProcInParams.get(i).getColumnName(), value);
|
|
|
-// System.out.println("Found Parameter - " + storeProcInParams.get(i).getColumnName() + " = " + value);
|
|
|
-// }
|
|
|
-// else
|
|
|
-// {
|
|
|
-// parameters.put(storeProcInParams.get(i).getColumnName(), procInParamValues[i]);
|
|
|
-// }
|
|
|
-// }
|
|
|
-// }
|
|
|
-// else if(sqlreqtype == SqlParser.SQL_TYPE_SELECTCONST)
|
|
|
-// {
|
|
|
-// System.out.println("Processing test_query...");
|
|
|
-// //ArrayList<EclColumnMetaData> columns = new ArrayList();
|
|
|
-// eclcode.append("selectstruct:=RECORD ");
|
|
|
-// expectedretcolumns = parser.getSelectColumns();
|
|
|
-// defaultEclQueryReturnDatasetName = "ConstECLQueryResult";
|
|
|
-// StringBuilder ecloutput = new StringBuilder(" OUTPUT(DATASET([{ ");
|
|
|
-// for (int i = 1; i <= expectedretcolumns.size(); i++)
|
|
|
-// {
|
|
|
-// EclColumnMetaData col = expectedretcolumns.get(i-1);
|
|
|
-// eclcode.append(col.getEclType()).append(" ").append(col.getColumnName()).append("; ");
|
|
|
-// ecloutput.append(col.getConstantValue());
|
|
|
-// if (i < expectedretcolumns.size())
|
|
|
-// ecloutput.append(", ");
|
|
|
-// }
|
|
|
-// ecloutput.append("}],selectstruct), NAMED(\'");
|
|
|
-// ecloutput.append(defaultEclQueryReturnDatasetName);
|
|
|
-// ecloutput.append("\'));");
|
|
|
-//
|
|
|
-// eclcode.append(" END; ");
|
|
|
-// eclcode.append(ecloutput.toString());
|
|
|
-//
|
|
|
-//
|
|
|
-// resultMetadata = new EclResultsetMetadata(expectedretcolumns, "Constants");
|
|
|
-//
|
|
|
-// }
|
|
|
-// else
|
|
|
-// {
|
|
|
-// throw new SQLException("SQL request type not determined");
|
|
|
-// }
|
|
|
-//
|
|
|
-// if(parser.hasOrderByColumns())
|
|
|
-// {
|
|
|
-// parameters.put("ORDERBY",parser.getOrderByString());
|
|
|
-// }
|
|
|
-// if (parser.hasGroupByColumns())
|
|
|
-// parameters.put("GROUPBY",parser.getGroupByString());
|
|
|
-// if (parser.hasLimitBy())
|
|
|
-// parameters.put("LIMIT",parser.getLimit());
|
|
|
-//
|
|
|
-// EclEngine eclengine = new EclEngine(hpccfilename, defaultEclQueryReturnDatasetName, connection.getProperties());
|
|
|
-// ArrayList dsList = null;
|
|
|
-//
|
|
|
-// if(sqlreqtype == SqlParser.SQL_TYPE_SELECT)
|
|
|
-// {
|
|
|
-// dsList = eclengine.executeSelect(eclcode.toString(), parameters, indexfiletouse);
|
|
|
-// }
|
|
|
-// else if(sqlreqtype == SqlParser.SQL_TYPE_CALL)
|
|
|
-// {
|
|
|
-// dsList = eclengine.executeCall(parameters);
|
|
|
-// }
|
|
|
-// else if(sqlreqtype == SqlParser.SQL_TYPE_SELECTCONST)
|
|
|
-// {
|
|
|
-// dsList = eclengine.executeSelectConstant(eclcode.toString());
|
|
|
-// }
|
|
|
-//
|
|
|
-// /*if (wsEcl.hasResultSchema())
|
|
|
-// {
|
|
|
-// Properties res = new Properties();f
|
|
|
-// //EclDatabaseMetaData.registerSchemaElements(wsEcl.getResultschema().item(0), res, "");
|
|
|
-//
|
|
|
-// NodeList resSchema = wsEcl.getResultschema();
|
|
|
-// for (int i = 0; i < resSchema.getLength(); i++)
|
|
|
-// {
|
|
|
-// org.w3c.dom.Node node = resSchema.item(i);
|
|
|
-// String nodename = node.getAttributes().getNamedItem("name").getNodeValue();
|
|
|
-// if (nodename.equalsIgnoreCase(defaultEclQueryReturnDatasetName))
|
|
|
-// {
|
|
|
-// System.out.print("we found result schema");
|
|
|
-// NodeList schemas = node.getChildNodes();
|
|
|
-// for (int j = 0; j < schemas.getLength(); j++)
|
|
|
-// {
|
|
|
-// org.w3c.dom.Node schema = schemas.item(j);
|
|
|
-// if(schema.getNodeType() != org.w3c.dom.Node.TEXT_NODE)
|
|
|
-// {
|
|
|
-// resultMetadata.parseResultSchema(schema);
|
|
|
-// //dbMetadata.registerSchemaElements(schema, res, "");
|
|
|
-// break;
|
|
|
-// }
|
|
|
-// }
|
|
|
-// break;
|
|
|
-// }
|
|
|
-// }
|
|
|
-// }*/
|
|
|
-//
|
|
|
-// // Get the data
|
|
|
-// fetchData(dsList,expectedretcolumns);
|
|
|
-//
|
|
|
-// }
|
|
|
-// catch (Exception ex)
|
|
|
-// {
|
|
|
-// if (ex.getMessage() != null)
|
|
|
-// warnings.add(new SQLWarning(ex.getMessage()));
|
|
|
-// throw new SQLException(ex);
|
|
|
-// }
|
|
|
}
|
|
|
|
|
|
private void fetchData(ArrayList dsList, List<EclColumnMetaData> expectedretcolumns)
|