You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafodion.apache.org by li...@apache.org on 2016/12/08 00:45:47 UTC

[20/38] incubator-trafodion git commit: convert trafci project into maven project

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/de7e7d4e/core/conn/trafci/src/main/java/org/trafodion/ci/DatabaseQuery.java
----------------------------------------------------------------------
diff --git a/core/conn/trafci/src/main/java/org/trafodion/ci/DatabaseQuery.java b/core/conn/trafci/src/main/java/org/trafodion/ci/DatabaseQuery.java
new file mode 100644
index 0000000..8b8b2ac
--- /dev/null
+++ b/core/conn/trafci/src/main/java/org/trafodion/ci/DatabaseQuery.java
@@ -0,0 +1,1804 @@
+// @@@ START COPYRIGHT @@@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+// @@@ END COPYRIGHT @@@
+
+package org.trafodion.ci;
+
+import java.io.IOException;
+import java.sql.ParameterMetaData;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.SQLWarning;
+import java.sql.Types;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.sql.PreparedStatement;
+import org.trafodion.jdbc.t4.TrafT4Connection;
+import org.trafodion.jdbc.t4.TrafT4Statement;
+import java.sql.CallableStatement;
+
+
+public class DatabaseQuery extends QueryWrapper
+{
+
+   private HashMap<String,String> dbKeyMap=null;
+   private int[] colSize={};
+   private int[] colAlign={};
+   private List<String> procParamList=null;
+   CallableStatement cStmt =null;
+   String[] columnNameArray={};
+   boolean getStatsDone = false;
+   boolean implicitQry  = false;
+   String qryText = null;
+   String getStatsCmd = "get statistics";
+   String getStatsNcCmd = "get statistics, options 'nc'";
+   public ResultSet rsObj = null;
+   String userQry = null;
+   boolean userQryTrimOut = false;
+   
+   //Create a pattern for matching parameter names
+   private static Pattern queryParamNamesPattern =
+	   Pattern.compile("^(.*)?([=\\+\\-~( ]\\s*\\?)([a-zA-Z0-9_]*)(.*)",Pattern.MULTILINE);
+
+   // this string array constants should match the cases grouped in ValidateQuery object.
+   // All commands beginning with SHOW have the trimOut flag set to true in the default case
+   // of executeInternal method. 
+   
+   private final String[] trimKeysList={ "INVOKE",
+                                "SHOWDDL",
+                                "SHOWSHAPE",
+                                "SHOWCONTROL",
+                                "SHOWTRANSACTION",
+                                "REORG",
+                                "REORGANIZE",
+                                "MAINTAIN",
+                                "REPLICATE",
+                                "SHOWLABEL",
+                                "SHOWPLAN",
+                                "EXPLAIN",
+                                "GET"
+                                       };
+
+   HashMap<Integer,String> inOutParamMap=null;
+   DatabaseQuery()
+   {
+
+   }
+
+   DatabaseQuery(Session sessObj)
+   {
+      super(sessObj);
+      loadDbKeyWordMap();
+   }
+   
+   public void execute() throws IOException, SQLException, UnKnownInterfaceCommand, UserInterruption
+   {
+	   try{
+           executeInternal();
+       }catch(IOException ioe){
+           throw ioe;
+       }catch(SQLException sqlex){
+           throw sqlex;
+       }catch(UnKnownInterfaceCommand uic){
+           throw uic;
+       }catch(UserInterruption ui){
+           throw ui;
+       }catch(Exception ex){
+           if(Boolean.getBoolean("trafci.enableTrace"))
+             ex.printStackTrace();
+           
+           ErrorObject internalError = new ErrorObject(SessionError.INTERNAL_ERR.errorCode(), 
+                   SessionError.INTERNAL_ERR.errorMessage() + " Details=" + ex.getMessage());
+           
+           writer.writeError(sessObj,internalError);
+                  
+           throw new UnKnownInterfaceCommand();
+       }
+   }
+   
+   public void executeInternal() throws IOException, SQLException, UnKnownInterfaceCommand, UserInterruption
+   {
+	   
+      String stmtName=null;
+      String cmdToken=null;
+      getStatsDone=false;
+      sessObj.setImplicitGetStatsQry(false);
+
+      init();
+
+      qryObj.resetRowCount();
+      qryObj.setStmtType(null);
+
+      readQuery();
+  
+      /* Check for pattern*/
+      String key,value=null;
+      boolean matchedPattern = false;
+      
+      for (int i=0;i < sessObj.getMaxPatternDepth() ; i++)
+      {
+    	  //Look for $$KEY$$ pattern
+    	  Matcher mat = parser.getKeyPatternMatcher(queryStr);
+    	  StringBuffer sb = new StringBuffer();
+    	  while (mat.find()) {
+    		  key = mat.group(2);
+    		  value = sessObj.getPatternValue(key);
+			  if (value!=null)
+			  {
+				  key = "$$" + key + "$$";
+			      key = key.replaceAll("\\$","\\\\\\$"); // Every $ needs to be replaced with \$. Do not delete the backslashes.se
+			      if (mat.group(1)!=null)
+			    	  mat.appendReplacement(sb,mat.group(1) + value);
+			      else
+			    	  mat.appendReplacement(sb, value);
+			      matchedPattern = true;
+		      }
+    	  }
+    	  
+    	  if (matchedPattern) 
+    	  {
+    		  mat.appendTail(sb);
+    		  queryStr = sb.toString();
+    		  parser.setRemainderStr(queryStr);
+    	  }
+    	 
+	      //Look for regular expression pattern
+    	  HashMap<String,String> regExpMap = sessObj.getRegExpMap();
+    	  if (regExpMap != null )
+    	  {
+    		  Iterator<String> regExpMapIt = regExpMap.keySet().iterator();
+    		  String regExpPat = null;
+    		  while (regExpMapIt.hasNext())
+    		  {
+    			  regExpPat =  (String)regExpMapIt.next();
+    			  if (sessObj.isDebugOn())
+                	  System.out.println(this.getClass().getName() +  ":: regExpPat :"+ regExpPat);
+    			  if (queryStr.matches(regExpPat))
+    			  {
+    				  matchedPattern = true;
+    				  queryStr = queryStr.replaceFirst(regExpPat,regExpMap.get(regExpPat).toString());
+    			  }
+    		  }
+	    	  
+	      }//End IF-ELSE
+    	  qryObj.setQueryId(sessObj.getVQryObj().getQueryId(queryStr));
+    	  parser.setRemainderStr(queryStr);
+      }//End For
+
+      if (sessObj.isDebugOn())
+    	  System.out.println(this.getClass().getName() +  ":: QueryStr :"+ queryStr);
+      
+      /* Commenting this for now until I fix all the issues for interface commands */
+      /*
+      if ((matchedPattern) && dbKeyMap.get(sessObj.getVQryObj().getFirstToken(queryStr))==null) {
+    	  InputStream theStream = new ByteArrayInputStream(queryStr.getBytes());
+    	  sessObj.setLogCmdEcho(false);
+    	  sessObj.iQryObj.execObeyStream(theStream, "Pattern Replacement");
+    	  return;
+      }
+      */
+
+      switch (qryObj.getQueryId())
+      {
+
+         // the first key word is set
+         case SessionDefaults.SET:
+            parser.getNextKeyToken();
+            execSet();
+            break;
+
+         case SessionDefaults.PREPARE:
+            parsePrepareStmt();
+            break;
+
+         case SessionDefaults.EXECUTE:
+            bind();
+            break;
+
+         case SessionDefaults.CALL:
+            procParamList = getParamNames(parser.getRemainderStr());
+            if (sessObj.isSessionAutoPrepare())
+            {
+               prepare(parser.getRemainderStr(), sessObj.getAutoPrepStmtName());
+               executeProcedure(procParamList,false);
+            }
+            else
+            {
+               prepareCallStmt(null);
+               executeProcedure(procParamList,true);
+            }
+
+            break;
+
+         case SessionDefaults.INFOSTATS:
+            cmdToken = parser.getNextKeyToken();
+            stmtName = parser.getNextValueToken();
+            if (cmdToken != null && (stmtName !=null && !stmtName.trim().equals("")))
+            {
+               stmtName = "\"" + stmtName + "\"";
+               if (parser.getRemainderStr() != null)
+               {
+                  queryStr=cmdToken + " " + stmtName + parser.getRemainderStr();
+               }
+               else
+               {
+                  queryStr=cmdToken + " " + stmtName ;
+               }
+
+            }
+            executeQuery(true);
+            break;
+
+         case SessionDefaults.GET:
+            execGet(true);
+            break;
+            
+         case SessionDefaults.CONTROL:
+             execControl();
+             break;
+            
+         default:
+            
+            //For commands beginning with SHOW (SHOWTRANSACTION,SHOWSET)
+            //set the trimout flag to true
+            if (qryObj.getQueryText().matches("(?is)SHOW.+"))
+               qryObj.setTrimOut(true);
+            if (sessObj.isSessionAutoPrepare())
+            {
+               prepare(parser.getRemainderStr(),sessObj.getAutoPrepStmtName());
+               parser.setRemainderStr("EXECUTE " + sessObj.getAutoPrepStmtName());
+               bind();
+            }
+            else
+            {
+               executeQuery(true);
+            }
+      }
+
+      /*
+      send an implicit GET STATISTICS command to
+      display the statistics for the previously
+      executed SQL statement. This is done only
+      when statistics in enabled via a SET STATISTICS
+      ON command.
+      */
+      if (sessObj.isSessionStatsEnabled() && !getStatsDone && !blockGetStats())
+      {
+         boolean oldstate = sessObj.isSessionTimingOn();
+         /* Store the query and reset the query text with this
+          * value once get statistics is executed. This is needed to
+          * avoid get statistics to be added in history.
+          */
+         userQry = qryObj.getQueryText();
+         userQryTrimOut = qryObj.isTrimOut();
+         sessObj.setImplicitGetStatsQry(true);
+         try 
+         {
+            sessObj.setSessionTiming(false);
+            writer.writeStatusMsg( sessObj,  qryObj,  utils,  writer);
+            writer.writeln();
+         } finally 
+         {
+            sessObj.setSessionTiming(oldstate);
+         }
+
+         //Overwrite the queryStr with the 'GET STATISTICS'
+         //command. dbExec executes the command stored in
+         //queryStr.
+         queryStr = getStatsCmd;
+         qryObj.resetQueryText(queryStr);
+         parser.setRemainderStr(queryStr);
+         String qryRowCnt = qryObj.getRowCount();
+         qryObj.setRowCount(null);
+         execGet(false);
+         //Reset the record count to row count of the
+         //original query
+         qryObj.setRowCount(qryRowCnt);
+                 
+         
+      }
+
+   }
+
+   private void parsePrepareStmt() throws IOException, SQLWarning, SQLException, UnKnownInterfaceCommand
+   {
+//      PreparedStatement pStmt=null;
+      String stmtName=null;
+      String query=null;
+      String fromKeyToken=null;
+
+      parser.getNextKeyToken();
+      stmtName = parser.getNextPreparedStmtNameToken();
+      if (stmtName==null)
+      {
+         writeln(ise.getSyntaxError(this.queryStr,parser.getRemainderStr()).errorMessage());
+         throw uic;
+      }
+      fromKeyToken = parser.getNextKeyToken();
+      if (fromKeyToken == null || !fromKeyToken.equalsIgnoreCase("FROM"))
+      {
+         writeln(ise.getSyntaxError(this.queryStr,parser.getRemainderStr()).errorMessage());
+         throw uic;
+      }
+      query = parser.getRemainderStr().trim();
+      if (query == null || query.equalsIgnoreCase(""))
+      {
+         writeln(ise.getSyntaxError(this.queryStr,parser.getRemainderStr()).errorMessage());
+         throw uic;
+      }
+
+      prepare(query,stmtName);
+   }
+
+   private void prepare(String qry,String stmtName) throws SQLException, IOException
+   {
+      PreparedStatement pStmt = null;
+      boolean trimFlag = false;
+      for (int i=0;i < trimKeysList.length;i++)
+      {
+         if (qry.toUpperCase().startsWith(trimKeysList[i]))
+         {
+            trimFlag=true;
+            break;
+         }
+      }
+
+      //Changes to support PREPARE on SPJ's
+      if (qry.toUpperCase().startsWith("CALL"))
+      {
+         // Assign the sql query to queryStr. queryStr will be used
+         // to prepare the statement
+         queryStr = qry;
+         try
+         {
+            prepareCallStmt(stmtName);
+         }catch (SQLException sqlEx)
+         {
+            sessObj.removePrepStmtMap(stmtName);
+            throw sqlEx;
+         }
+         sessObj.setPrepStmtMap(stmtName,(Object)cStmt,trimFlag);
+         return;
+      }
+
+      sessObj.setQryStartTime();
+      if(sessObj.getPrepStmtMap(stmtName) != null)
+      {
+         sessObj.getPrepStmtMap(stmtName).close();
+         sessObj.removePrepStmtMap(stmtName);
+      } 
+      try
+      {
+         pStmt =((TrafT4Connection)conn).prepareStatement(qry,"\"" + stmtName + "\"");
+      }catch (SQLException sqlEx)
+      {
+         sessObj.removePrepStmtMap(stmtName);
+         throw sqlEx;
+      }
+     
+      sessObj.setQryEndTime();
+      
+      sessObj.setPrepStmtMap(stmtName,(Object)pStmt,trimFlag);
+      writeAllSQLWarnings(pStmt.getWarnings());
+      pStmt.clearWarnings();
+      /* This is to print the status message for XML/HTML correctly */
+      qryObj.setRowCount("0");
+   }
+
+   /**
+    *  Returns the evaluated parameter value.
+    *
+    *  @param   inputStr  The input string as the user specified it
+    *  @return  the evaluated input string (parameter value)
+    *
+    */
+   private String evaluateParameterValue(String inputStr) {
+       try {
+          ParamStringObject psv = parser.getParamValue(inputStr);
+          return psv.getParameterValue();
+
+      } catch(Exception e) {
+      }
+
+      return  inputStr;
+
+   }   /*  End of  evaluateParameterValue  method.  */
+   
+   private void bind() throws IOException, UnKnownInterfaceCommand, SQLException, UserInterruption
+   {
+      String keyToken = null;
+      String stmtName = null;
+      PreparedStatement pStmt;
+      List<String> paramList=null;
+      String[] errParams=new String[1];
+
+      keyToken = parser.getNextKeyToken();
+      stmtName = parser.getNextPreparedStmtNameToken();
+      if (stmtName == null)
+      {
+         writeln(ise.getSyntaxError(this.queryStr,parser.getRemainderStr()).errorMessage());
+         throw uic;
+      }
+      if (parser.hasMoreTokens())
+      {
+         keyToken = parser.getNextKeyToken();
+         if ((keyToken == null) || !(keyToken.equalsIgnoreCase("USING")))
+         {
+            writeln(ise.getSyntaxError(this.queryStr,parser.getRemainderStr()).errorMessage());
+            throw uic;
+         }
+
+         paramList = parser.getNextParamListToken();
+         if (paramList == null || paramList.size()==0)
+         {
+            writeln(ise.getSyntaxError(this.queryStr,parser.getRemainderStr()).errorMessage());
+            throw uic;
+
+         }
+         for (int i=0;i < paramList.size(); i++)
+         {
+            String paramValue=null;
+            if (paramList.get(i).toString().matches("^\\?\\S+"))
+            {
+               paramValue=sessObj.getSessParams(paramList.get(i).toString().substring(1));
+               if (paramValue != null)
+               {
+                  paramList.remove(i);
+                  paramList.add(i,evaluateParameterValue(paramValue));
+               }
+
+            }
+         }
+      }
+
+      // code repeated in blockGetStats, any changes here needs to
+      // be updated in the blockGetStats method also.
+      pStmt = (PreparedStatement)sessObj.getPrepStmtMap(stmtName);
+      org.trafodion.jdbc.t4.TrafT4PreparedStatement hpt4Stmt=(org.trafodion.jdbc.t4.TrafT4PreparedStatement)sessObj.getPrepStmtMap(stmtName);
+ 
+      if (pStmt == null)
+      {
+         errParams[0]=stmtName;
+         writer.writeError(sessObj, 'E',SessionError.STMT_NOT_FOUND,errParams);
+         throw uic;
+      }
+
+      String sqlQueryStr=((TrafT4Statement)pStmt).getSQL();
+      List<String> namedParamList=getParamNames(sqlQueryStr);
+      
+      // if using class is specified, merge the named parameters
+      // and unnamed params and create one param list
+      if (paramList != null)
+      {
+         int paramListIdx=0;
+         for (int j=0;j < namedParamList.size(); j++)
+         {
+            if (namedParamList.get(j).toString().matches("^\\?"))
+            {
+               if (paramList.size() < paramListIdx+1)
+               {
+                  break;
+               };
+               namedParamList.remove(j);
+               namedParamList.add(j,paramList.get(paramListIdx));
+               paramListIdx++;
+            };
+         }
+
+      }
+      paramList=namedParamList;
+
+      if (sqlQueryStr.toUpperCase().startsWith("CALL"))
+      {
+         qryObj.setStmtType(hpt4Stmt.getStatementType());
+         cStmt = (CallableStatement)pStmt;
+         sessObj.setQryStartTime();
+         executeProcedure(paramList,false);
+         return;
+      }
+
+      if (paramList !=null)
+      {
+         int namedParamErrors=0;
+         int index=0;
+
+         for (int i=0;i<paramList.size();i++)
+         {
+            String value=paramList.get(i).toString();
+            String paramName=value;
+            if (!(paramList.subList(0,i).contains(paramName)) || !paramList.get(i).toString().startsWith("?"))
+            {
+               if (value.matches("^\\?\\S+"))
+               {
+            	   String pv = (String) sessObj.getSessParams(value.substring(1));
+                   value = evaluateParameterValue(pv);
+               }
+               if ((value == null) || (paramName.equals("?")))
+               {
+                  if (paramName.equals("?"))
+                     paramName="?(UNNAMED_"+ (i+1) +")";
+
+                  writer.writeInterfaceErrors(sessObj, new ErrorObject(SessionError.PARAM_NOT_FOUND, "", paramName + " was not found"));
+                  
+                  namedParamErrors++;
+                  continue;
+
+               }
+//               dead code 
+//               if (value== null) 
+//            	   value=paramList.get(i).toString();
+               value=value.replaceAll("\'\'","\'");
+               try
+               {
+                  if (value!=null)
+                  {
+                     if (value.equalsIgnoreCase("NULL"))
+                        pStmt.setNull(index+1,Types.NULL);
+                     else
+                     {
+                        pStmt.setObject(index+1,new String(value.toString()));
+                     }
+                  }
+                  
+               }catch (NumberFormatException nfe)
+               {
+                  writer.writeError(sessObj,SessionError.NUMERIC_VAL_REQ);
+                  namedParamErrors++;
+                  continue;
+                  //throw uic;
+               }
+               finally
+               {
+            	   index++;
+               }
+            }
+         }
+
+         if (namedParamErrors >0)
+         {
+            throw uic;
+         }
+      }
+
+      sessObj.setQryStartTime();
+      if (!sessObj.getPrepTrimOut(stmtName))
+      {
+         pStmt.setMaxRows(sessObj.getListCount());
+      }else
+      {
+         qryObj.setTrimOut(true);
+      }
+               
+      boolean moreResults = dbExec(pStmt);
+      writeAllSQLWarnings(pStmt.getWarnings());
+      pStmt.clearWarnings();
+      qryObj.setStmtType(hpt4Stmt.getStatementType());
+
+      if (hpt4Stmt.getSQL().matches("(?i)\\s*CREATE\\s+((SET|VOLATILE|SET VOLATILE)\\s+)?TABLE\\s+.*\\s+AS\\s+SELECT\\s+.*"))
+    	  qryObj.setStmtType("CREATE_TABLE_AS");
+      
+      if (moreResults)
+      {
+         fetchResults(pStmt.getResultSet());
+      }
+      else
+      {
+         super.setQueryRowCount(pStmt);
+         
+         /* Modified this fix to call the execSet method for
+          * EXECUTE on SET SCHEMA and SET CATALOG
+          * instead of repeating the code again.
+          */
+         if ((sqlQueryStr.trim().matches("(?i)(?s)SET\\s+SCHEMA.*")) ||
+             (sqlQueryStr.trim().matches("(?i)(?s)SET\\s+CATALOG.*"))
+            )
+         {
+            String origQuery = qryObj.getQueryText();
+            qryObj.resetQueryText(sqlQueryStr);
+            queryStr = sqlQueryStr;
+            parser.setRemainderStr(sqlQueryStr);
+            parser.getNextKeyToken();
+            execSet();
+            qryObj.resetQueryText(origQuery);
+         }
+      
+         sessObj.setQryEndTime();
+         
+      }
+
+   }
+
+   private void prepareCallStmt(String stmtName) throws SQLException, IOException
+   {
+      sessObj.setQryStartTime();
+      //create a callable statement object for invoking SPJ's
+      try
+      {
+         if(sessObj.getPrepStmtMap(stmtName) != null)
+         {
+            sessObj.getPrepStmtMap(stmtName).close();
+            sessObj.removePrepStmtMap(stmtName);
+         } 
+      }catch(SQLException sqlEx){
+         ;
+      }
+      
+      try
+      {
+         cStmt = ((TrafT4Connection)conn).prepareCall(queryStr,"\"" + stmtName + "\"");
+      } catch (NoSuchMethodError nsme)
+      {
+         if (stmtName == null)
+            cStmt = conn.prepareCall(queryStr);
+         else
+         {
+            throw new SQLException(SessionError.CALL_ERR.errorMessage());
+         }
+      }
+      writeAllSQLWarnings(cStmt.getWarnings());
+      cStmt.clearWarnings();
+      sessObj.setQryEndTime();
+      /* This is to print the status message for XML/HTML correctly */
+      qryObj.setRowCount("0");
+
+   }
+
+   private void executeProcedure(List<String> callParamList,boolean deAllocStmt) throws IOException, UnKnownInterfaceCommand, SQLException
+   {
+      ParameterMetaData paramMetaData=null;
+      String paramName=null;
+      inOutParamMap = new HashMap<Integer,String>(); // contains the parameter index and the param name for INOUT and OUT params
+      boolean paramsExist = false; // this will be set to true only if the SPJ contains INOUT and OUT params
+      String value=null;
+      int namedParamErrors=0;
+      ResultSet rs=null;
+
+      if (callParamList.size() != 0)
+      {
+         paramMetaData = cStmt.getParameterMetaData();
+         if ((paramMetaData !=null))
+         {
+            //Set the values for dynamic parameters and register the
+            //out parameters
+            for (int i=1;i<=paramMetaData.getParameterCount();i++)
+            {
+               value = callParamList.get(i-1).toString();
+               paramName = value;
+
+               switch (paramMetaData.getParameterMode(i))
+               {
+                  case ParameterMetaData.parameterModeIn:
+                     //If named parameters have been specified, retrieve the value
+                     //from the session params hashmap and set the value in the
+                     //callable statement.
+                     if (value.matches("^\\?(\\S+)"))
+                     {
+                    	 String pv = (String) sessObj.getSessParams(value.substring(1));
+                         value = evaluateParameterValue(pv);
+                         if (sessObj.isDebugOn())
+                         {
+                        	 System.out.println("@@@Debug: DatabaseQuery:: pv = " +  pv);
+                             System.out.println("@@@Debug: DatabaseQuery:: value = " + value);
+                         }
+                     }
+                     if ((value == null) || paramName.equals("?"))
+                     {
+                        if (paramName.equals("?"))
+                           paramName="?(UNNAMED_"+ i +")";
+                        //writer.writeln("ERROR: Param "+paramName+ " was not found.");
+                        //String errorStr = "ERROR: Param "+paramName+ " was not found.";
+                        writer.writeInterfaceErrors(sessObj, new ErrorObject(SessionError.PARAM_NOT_FOUND, "", paramName + " was not found"));
+                        namedParamErrors++;
+                        continue;
+                     }
+                     try
+                     {
+                        if (value.equalsIgnoreCase("NULL"))
+                        {
+                           cStmt.setNull(i,Types.NULL);
+                        }
+                        else
+                        {
+                           cStmt.setObject(i,value);
+                        }
+                     }catch (NumberFormatException nfe)
+                     {
+                        writer.writeError(sessObj, SessionError.NUMERIC_VAL_REQ);
+                        namedParamErrors++;
+                        continue;
+                        //throw uic;
+                     }
+
+
+                     break;
+
+                  case ParameterMetaData.parameterModeInOut:
+
+                     if (value.matches("^\\?(\\S+)"))
+                     {
+                    	 String pv = (String) sessObj.getSessParams(value.substring(1));
+                         value = evaluateParameterValue(pv);
+                     }
+                     if ((value == null) || paramName.equals("?"))
+                     {
+                        if (paramName.equals("?"))
+                           paramName="?(UNNAMED_"+ i +")";
+                        //writer.writeln("ERROR: Param "+paramName+ " was not found.");
+                        //String errorStr = "ERROR: Param "+paramName+ " was not found.";
+                        writer.writeInterfaceErrors(sessObj, new ErrorObject(SessionError.PARAM_NOT_FOUND, "", paramName + " was not found"));
+                        namedParamErrors++;
+                        continue;
+                     }
+                     try
+                     {
+                        if (value.equalsIgnoreCase("NULL"))
+                        {
+                           cStmt.setNull(i,Types.NULL);
+                        }
+                        else
+                        {
+                           cStmt.setObject(i,value);
+                        }
+                     }catch (NumberFormatException nfe)
+                     {
+                        writer.writeError(sessObj, SessionError.NUMERIC_VAL_REQ);
+                        namedParamErrors++;
+                        continue;
+                        //throw uic;
+                     }
+
+                     if (paramName.matches("^\\?(\\S+)"))
+                        inOutParamMap.put(new Integer(i),paramName.substring(1));
+
+                     if (!paramsExist)
+                        paramsExist=true;
+
+                     break;
+
+                  case ParameterMetaData.parameterModeOut:
+                     cStmt.registerOutParameter(i,paramMetaData.getParameterType(i));
+                     // Add the param name and the index to the inOut Hashmap.
+                     // This will be used to bind the inout and out param values after
+                     // execute
+                     if (paramName.matches("^\\?(\\S+)"))
+                     {
+                        inOutParamMap.put(new Integer(i),paramName.substring(1));
+                     }
+
+                     if (!paramsExist)
+                        paramsExist=true;
+                     break;
+
+               } // end switch
+
+               //}// end if match()
+            } // end for
+         } //end if
+
+      }
+
+      if (namedParamErrors > 0)
+         throw uic;
+
+      sessObj.setInOutandRS(false);
+      qryText = qryObj.getQueryText();
+      ResultSetMetaData rsmd = cStmt.getMetaData();
+      boolean moreResults=dbExec(cStmt);
+      sessObj.setQryEndTime();
+      SQLWarning sqlWarn = cStmt.getWarnings();
+      writer.writeAllSQLWarnings(sessObj,sqlWarn);
+      qryObj.setRowCount(null);
+
+      if (rsmd !=null)
+      {
+         //call the write method only if the SPJ contains INOUT and OUT params
+         if (paramsExist)
+         {
+           if (sessObj.isSPJRS())
+               sessObj.setSPJRS(false);
+           writeOutParams(rsmd,rsmd.getColumnCount(),paramMetaData,cStmt);
+         
+         writer.writeln();
+         }
+      }
+
+      if (moreResults)
+      {
+         if (paramsExist)
+            sessObj.setInOutandRS(true);
+         sessObj.setSPJRS(true);
+         qryObj.setRsCount(0);
+         qryObj.setRowCount(null);
+         while (moreResults)
+         {
+            rs = cStmt.getResultSet();
+            fetchResults(rs);
+            qryObj.incrRsCount();
+            qryObj.resetQueryText("SELECT *"); // Need to reset the qrytext to display no. of rows selected for status msg
+            writer.writeStatusMsg(sessObj,qryObj,utils, writer);
+            qryObj.resetQueryText(qryText); // Resetting the qry back to the original query Text for final status msg
+            writer.writeln();
+            qryObj.setRowCount(null);
+            sessObj.setInOutandRS(false);
+            //Check this without type casting to TrafT4Statement
+            moreResults = ((TrafT4Statement)cStmt).getMoreResults();
+         }
+         qryObj.setRowCount(new Integer(qryObj.getRsCount()).toString());
+         sessObj.setSPJRS(false);
+      }
+      else if (paramsExist)
+      {
+         qryObj.setRowCount("1");
+      }
+      else
+         qryObj.setRowCount("0");
+      if (deAllocStmt)
+         cStmt.close();
+   }
+
+   
+   private void execControl() throws SQLException, IOException, UnKnownInterfaceCommand, UserInterruption
+   {
+	   String remStr = parser.getRemainderStr();
+	   
+	   if (remStr.matches("(?is)\\s*CONTROL\\s+QUERY\\s+DEFAULT\\s+SCHEMA\\s+(.*)") || 
+		   remStr.matches("(?is)\\s*CONTROL\\s+QUERY\\s+DEFAULT\\s+DEFAULT_SCHEMA_NAMETYPE\\s+(.*)"))
+	   {
+		   executeQuery(true);
+		   queryStr = "showcontrol default schema, match full, no header";
+		   try {
+			   java.sql.Statement stmtSch = conn.createStatement();
+			   ResultSet rs = stmtSch.executeQuery(queryStr);
+			   
+			   if (rs!=null && rs.next())
+		       {
+				   sessObj.setSessionSchema(rs.getString(1));
+		       }
+		       rs.close();
+		       stmtSch.close();
+		    } catch (Exception ex)
+		    {
+		        // System.out.println("Error : ExecControl :"+ex.getMessage());
+		    }
+	   }
+	   else
+	   {
+		   executeQuery(true);
+		  
+	   }
+   }
+   
+   private void execSet() throws SQLException, IOException, UnKnownInterfaceCommand, UserInterruption
+   {
+      String setOption=parser.getNextKeyToken();
+      
+      // not a keyword..then its not ours
+      if (setOption == null)
+      {
+         executeQuery(true);
+         return;
+      }
+      else
+      {
+         setOption=(String) dbKeyMap.get("SET_"+setOption.toUpperCase());
+
+         if (setOption == null)
+         {
+            executeQuery(true);
+            return;
+         }
+
+         int setId=Integer.parseInt(setOption);
+         switch (setId)
+         {
+            case SessionDefaults.SET_SCHEMA:
+               executeQuery(true);
+               List<String> csList=parser.getCSTList(parser.getRemainderStr());
+               switch (csList.size())
+               {
+                  case 2:
+                     conn.setCatalog(csList.get(0).toString());
+                     sessObj.setSessionCtlg(conn.getCatalog());
+                     sessObj.setSessionSchema(csList.get(1).toString());
+                     break;
+                  case 1:
+                     sessObj.setSessionSchema(csList.get(0).toString());
+                     break;
+               }
+               sessObj.getEnvMap().put("SCHEMA", sessObj.getSessionSchema());
+               // This is needed in the blockGetStats method
+               qryObj.setQueryId(setId);
+               break;
+               
+            case SessionDefaults.SET_CATALOG:
+               sessObj.setQryStartTime();
+               String ctlgValue = parser.getCatalogToken();
+               if (ctlgValue == null)
+                  ctlgValue="";
+               conn.setCatalog(ctlgValue);
+               sessObj.setQryEndTime();
+               sessObj.setSessionCtlg(conn.getCatalog());
+               sessObj.getEnvMap().put("CATALOG", sessObj.getSessionCtlg());
+               qryObj.setRowCount("0");
+               qryObj.setQueryId(setId);
+               break;
+
+            case SessionDefaults.SET_SERVICE:
+               executeQuery(true);
+               break;
+         
+               
+            default:
+               executeQuery(true);
+               break;
+         }
+      }
+
+
+
+   }
+   
+   public boolean  userExecutedGetStatistics()
+   {
+       return getStatsDone;
+   }
+
+
+   private void execGet(boolean setQueryStartTimeFlag) throws SQLException, IOException, UnKnownInterfaceCommand
+   {
+	  float prodVersion = 0.0f;
+     
+      parser.getNextKeyToken();
+      if (!Utils.trimSQLTerminator(qryObj.getQueryText(), sessObj.getSessionSQLTerminator()).matches("(?i)\\s*get\\s+service\\s*"))
+         qryObj.setTrimOut(true);
+      else
+         qryObj.setTrimOut(false);
+
+      String getOption=parser.getNextWordToken();
+      if ((getOption != null) && (getOption.toUpperCase().equals("STATISTICS")))
+      {
+         try {
+        	 
+        	 if (sessObj.isDebugOn())
+            	 System.out.println("Database Query::execGet:: " + prodVersion);
+
+         } catch (NullPointerException npe){}
+         getOption = parser.getNextKeyToken();
+         if (getOption == null)
+         {
+               queryStr = getStatsNcCmd;
+         }
+         if (sessObj.isDebugOn())
+         {
+        	 System.out.println("Database Query::execGet:: " + queryStr);
+         }
+         try
+         {
+            executeQuery(setQueryStartTimeFlag);
+            if (setQueryStartTimeFlag)
+               getStatsDone=true;
+            
+         }catch (SQLException sqlEx)
+         {
+            getStatsDone=false;
+            throw sqlEx;
+         }
+      }
+      else
+      {
+         executeQuery(true);
+      }
+
+   }
+   
+   public void resetQryObj()
+   {
+      if ((sessObj.getDisplayFormat() != SessionDefaults.XML_FORMAT) &&
+          (sessObj.getDisplayFormat() != SessionDefaults.HTML_FORMAT) &&
+          (sessObj.isImplicitGetStatsQry())
+          )
+      {
+         qryObj.resetQueryText(userQry);
+         qryObj.setTrimOut(userQryTrimOut);
+      }
+  
+   }
+
+
+   private void executeQuery(boolean setQueryStartTimeFlag) throws SQLException, IOException, UnKnownInterfaceCommand
+   {
+      if (setQueryStartTimeFlag)
+         sessObj.setQryStartTime();
+      //    if the list count is set..
+      if (!qryObj.isTrimOut() && sessObj.getListCount() !=0)
+      {
+         stmt.setMaxRows(sessObj.getListCount());
+      }else
+      {
+         stmt.setMaxRows(0);
+      }
+      
+      // Check to see if query string has ? mark characters
+      boolean paramsPatternFound = false;
+      boolean queryHasParams = ( queryStr.indexOf("?") != -1 );
+      if (queryHasParams)
+      {
+    	  // Doing a more expensive pattern matching check to see if the ? is a 
+    	  // parameter and not a literal.
+    	  try {
+    		  Matcher mat = queryParamNamesPattern.matcher(queryStr);
+    		  paramsPatternFound = mat.find();
+    		  if (sessObj.isDebugOn())
+    			  System.out.println(this.getClass().getName() +
+    					  ":: Matcher.find : " + queryHasParams);
+    	  } catch (Exception ex) 
+    	  {
+    		  if (sessObj.isDebugOn())
+    			  System.out.println(this.getClass().getName() +
+    					 ":: Param name regexp pattern error : " +
+    					 ex.getMessage());
+    	  }
+      }
+            
+      if ((queryHasParams || paramsPatternFound)  &&
+          (qryObj.getQueryId() != SessionDefaults.EXPLAIN)   &&
+          (qryObj.getQueryId() != SessionDefaults.SHOWPLAN)  &&
+          (qryObj.getQueryId() != SessionDefaults.SHOWSHAPE) )
+      {
+         List<String> paramList=getParamNames(queryStr);
+         if (paramList.size() > 0)
+         {
+            PreparedStatement ps=null;
+            ps=conn.prepareStatement(queryStr);
+            String paramName=null;
+            String paramValue=null;
+            int namedParamErrors=0;
+
+            int index=0;
+            for (int i=0;i < paramList.size(); i++)
+            {
+               paramName=paramList.get(i).toString();
+               if (!( paramList.subList(0,i).contains(paramName)))
+               {
+                  if (paramName.equals("?"))
+                  {
+                     paramName="?(UNNAMED_"+ (i+1) +")";
+                  }
+                  if ((paramValue=sessObj.getSessParams(paramName.substring(1))) == null)
+                  {
+                     writer.writeInterfaceErrors(sessObj, new ErrorObject(SessionError.PARAM_NOT_FOUND, "", paramName + " was not found"));
+                     namedParamErrors++;
+                     continue;
+                  }
+                  paramValue = evaluateParameterValue(paramValue);
+                  try
+                  {
+                     if (paramValue.equalsIgnoreCase("NULL"))
+                     {
+                        ps.setNull(index+1,Types.NULL);
+                     }else
+                     {
+                        ps.setObject(index+1,paramValue);
+                     }
+                  }catch (NumberFormatException nfe)
+                  {
+                     writer.writeError(sessObj, SessionError.NUMERIC_VAL_REQ);
+                     namedParamErrors++;
+                     //throw uic;
+                     continue;
+                  }
+                  finally
+                  {
+                	  index++;  
+                  }
+               }
+            }
+            if (namedParamErrors>0)
+            {
+               throw uic;
+            }
+            ps.setMaxRows(sessObj.getListCount());
+
+            sessObj.setCurrentStmtObj(ps);
+
+            if (dbExec(ps))
+            {
+              
+               writeAllSQLWarnings(ps.getWarnings());
+               ps.clearWarnings();
+               fetchResults(ps.getResultSet());
+            }
+            else
+            {
+               writeAllSQLWarnings(ps.getWarnings());
+               ps.clearWarnings();
+                
+               sessObj.setCurrentStmtObj(null);
+               super.setQueryRowCount(ps);
+               sessObj.setQryEndTime();
+            }
+            
+            resetQryObj();
+            return;
+         }
+      }
+
+      sessObj.setCurrentStmtObj(stmt);
+
+      if (dbExec(stmt))
+      {
+         writeAllSQLWarnings(stmt.getWarnings());
+         
+         stmt.clearWarnings();
+         rsObj= stmt.getResultSet();
+         if (qryObj.getQueryId()==SessionDefaults.SHOW_SERVICE)
+            return; 
+         fetchResults(stmt.getResultSet());
+      }
+      else
+      {
+         writeAllSQLWarnings(stmt.getWarnings());
+         stmt.clearWarnings();
+         super.setQueryRowCount(stmt);
+         sessObj.setQryEndTime();
+      }
+
+      stmt.close();
+      sessObj.setStmtObj(sessObj.getConnObj().createStatement());
+      this.stmt=sessObj.getStmtObj();
+      resetQryObj();
+   }
+
+   private void fetchResults(ResultSet rs) throws SQLException, IOException
+   {
+      boolean isHeadingPrinted=false;
+      ResultSetMetaData rsmd=rs.getMetaData();
+      int numColumns = rsmd.getColumnCount();
+      int rowCnt=0;
+      qryObj.setColCount(String.valueOf(numColumns));
+      if (sessObj.getFetchSize() > 0)
+      {
+    	  rs.setFetchSize(sessObj.getFetchSize());
+      }
+
+      try {
+    	  for (rowCnt=0; rs.next();rowCnt++)
+          {
+             sessObj.setCurrentStmtObj(null);
+             if (sessObj.isQueryInterrupted())
+             {
+                writer.writeln(SessionDefaults.lineSeperator+"*** WARNING: User interrupt [^C] received. Truncating data ... ");
+                break;
+             }
+             
+             /**
+              *   Warnings are returned as part of fetch so
+              *   we need to handle them.
+              */
+             isHeadingPrinted = printAnyWarningsDuringFetch(rs, isHeadingPrinted);
+             
+             if (!isHeadingPrinted)
+             {
+                writeHeader(rsmd,numColumns);
+                isHeadingPrinted=true;
+             }
+             writeData(rs,numColumns);
+          }
+      } catch(java.lang.OutOfMemoryError e) {
+    	  /**
+    	   * Internal Analysis: JDBC Driver throws java.lang.OutOfMemoryError: Heap Out Space
+    	   * the Exception was thrown by interfaceResultSet.fetch() method.
+    	   * BufferedSize in JDBC exceeds and only can hold up to certain limit. 
+    	   * "length = 1493630996", which value is  very big that caused
+           *  the OutofMemoryEror
+    	   * 
+    	   * catch the OutOfMemory Exception 
+    	   */
+    	  throw new SQLException(
+    	     "Unable to display result data - OutOfMemory.");
+      }
+      
+      /**
+       *   Warnings are returned as part of fetch so
+       *   we need to handle them even if there are no results.
+       */
+      isHeadingPrinted = printAnyWarningsDuringFetch(rs, isHeadingPrinted);
+       
+      
+      // if heading printed, then there are some rows retrieved from the db. so write a new line at the end
+      if (isHeadingPrinted && sessObj.getDisplayFormat() == SessionDefaults.RAW_FORMAT)
+      {
+         writer.writeln();
+      }
+
+      if (sessObj.getListCount() != 0 && sessObj.getListCount() == rowCnt && !qryObj.isTrimOut())
+      {
+         qryObj.setStmtType("SELECT_LIST_COUNT");
+      }
+      if (!sessObj.isImplicitGetStatsQry())
+         qryObj.setRowCount(String.valueOf(rowCnt));
+
+      try
+      {
+         rs.close();
+      } catch (SQLException sqle)
+      {
+      }
+      finally
+      {
+         sessObj.setQryEndTime();
+      }
+   }
+
+   /**
+    *  Prints any warnings encountered as part of the fetch and displays
+    *  them inline with the results. The method takes care of automatically
+    *  printing headings for XML and HTML markups before the warnings are
+    *  printed out.
+    *
+    *  @param   rs                The ResultSet object
+    *  @param   isHeadingPrinted  Controls whether or not we need to print
+    *                             the headings
+    *
+    *  @return  Whether or not headings were printed out
+    *
+    */
+   private boolean printAnyWarningsDuringFetch(ResultSet rs,
+                                               boolean isHeadingPrinted)
+              throws SQLException, IOException {
+
+      /**
+       *   Check if the ResultSet parameter is valid.
+       */
+      if (null == rs)
+         return isHeadingPrinted;
+
+
+      /**
+       *   Second check is to see if we have any warnings.
+       */
+      SQLWarning  rsWarnings = rs.getWarnings();
+      if (null == rsWarnings)
+         return isHeadingPrinted;
+
+
+
+      /**
+       *   We could have probably passed these down as parameters -- but
+       *   rather than "burden" the stack, we just call these APIs when
+       *   there are warnings. These calls should anyway be "thin" calls.
+       */
+      ResultSetMetaData rsmd       = rs.getMetaData();
+      int               numColumns = rsmd.getColumnCount();
+
+
+      /**
+       *   Warnings are returned as part of fetch and
+       *   need to be displayed along with the results. However we need 
+       *   to print headings for XML and HTML markups before the warnings.
+       */
+      if (!isHeadingPrinted) {
+         /*  Get the display format currently in use.  */
+         int displayFmt = sessObj.getDisplayFormat();
+
+
+         /*
+          *  If heading was not printed, do so for HTML and XML markups.
+          *  This allows any warnings to be embedded within the output.
+          */
+         if ((SessionDefaults.XML_FORMAT == displayFmt)  ||
+             (SessionDefaults.HTML_FORMAT == displayFmt) ) {
+            writeHeader(rsmd, numColumns);
+            isHeadingPrinted = true;
+         }
+
+      }    /*  End of  IF  headings weren't printed.  */
+
+
+
+      /**
+       *   Warnings are returned as part of fetch.
+       *   We already checked for warnings, now just print 'em out.
+       *   Note calling rs.getWarnings() should clear the warnings, so
+       *   we don't have any warnings to do the next time around.
+       *   But JDBC/T4 didn't implement that part of the spec correctly
+       *   in older drivers, so we do some double work here and call
+       *   ResultSet.clearWarnings(). That way:
+       *      1>  We will work w/ older T4 drivers, which don't clear these.
+       *          So we got to step in and give a bit of a nudge!!
+       *      2>  On newer well-behaved T4 drivers, this becomes a NOOP.
+       *          We do the clearWarnings work twice (automatically done in 
+       *          the T4 driver) and once here when we have any warnings.
+       */
+      writer.writeAllFetchWarnings(sessObj, rsWarnings, numColumns);
+      sessObj.setSqlWarningsCnt(sessObj.getSqlWarningsCnt() + 1);
+      rs.clearWarnings();
+
+
+      /**
+       *  Returns the state of whether or not we printed the headings out.
+       */
+      return isHeadingPrinted;
+
+   }  /*  End of  printAnyWarningsDuringFetch  method.  */
+
+   private String writeData(ResultSet rs,int numColumns) throws SQLException, IOException
+   {
+     
+      for (int i=1;i<=numColumns ;i++)
+      {
+         String value=null;
+         try
+         {
+            value=rs.getString(i);
+            if (sessObj.getQuery().getQueryId() == SessionDefaults.SHOW_SERVICE)
+               return value;
+         } catch (SQLException sqlEx)
+         {
+            //For blob objects, getString() throws a SQLException.
+            //Displaying null in this case.
+         }
+
+         ResultSetMetaData rsmd = rs.getMetaData();
+         if(value != null && rsmd.getColumnType(i)==Types.TIMESTAMP && value.length() < rsmd.getColumnDisplaySize(i))
+         {
+          	 value = (value.trim()+"000000").substring(0,rsmd.getColumnDisplaySize(i));
+         } 
+         
+         if (value == null)
+         {
+            value=sessObj.getSessNull();
+            if (sessObj.getSessView() == SessionDefaults.MXCI_VIEW)
+                value = "?";
+         }
+        
+         switch (sessObj.getDisplayFormat())
+         {
+            case SessionDefaults.RAW_FORMAT :
+               if (qryObj.isTrimOut())
+               {
+                  formatOutput(value,value.length(),' ',0);
+               }
+               else
+               {
+                  formatOutput(value,colSize[i-1],' ',colAlign[i-1]);
+               }
+
+               if (i < numColumns)
+               {
+                  writeSeparator();
+               }
+               break;
+
+
+            case SessionDefaults.XML_FORMAT :
+               formatXmlOutput(columnNameArray[i-1],value);
+               break;
+
+            case SessionDefaults.HTML_FORMAT:
+               formatHtmlOutput(value);
+               break;
+
+            case SessionDefaults.CSV_FORMAT:
+               formatCsvOutput(value);
+               break;
+         }
+
+      }
+
+      if (sessObj.getDisplayFormat() == SessionDefaults.RAW_FORMAT)
+         writeln();
+
+      return null;
+   }
+
+   private void writeHeader(ResultSetMetaData rsmd,int numColumns) throws SQLException, IOException
+   {
+      columnNameArray = new String[numColumns];
+      colSize=new int[numColumns];
+      colAlign=new int[numColumns];
+      
+      int totalWidth = 0;
+      
+      if (qryObj.isTrimOut())
+      {
+         return;
+      }
+      for (int i=1;i<=numColumns ;i++)
+      {
+          
+         int colNameSize = rsmd.getColumnName(i).length(); 
+         if (sessObj.isMultiByteAlign() && (isoMapping == 10 || isoMapping == 15)) //SJIS or UTF8
+         {
+             try
+             {
+                 colNameSize = getMultiByteColWidth(new StringBuffer(rsmd.getColumnName(i)));
+             }
+             catch (Exception ex)
+             {
+                 ex.printStackTrace();
+             }
+         }  
+         
+         if (colNameSize > rsmd.getColumnDisplaySize(i))
+            colSize[i-1]=colNameSize;
+         else
+            colSize[i-1]=rsmd.getColumnDisplaySize(i);
+
+         if (colSize[i-1] < SessionDefaults.MIN_COL_DISPLAY_SIZE)
+         {
+            colSize[i-1] = SessionDefaults.MIN_COL_DISPLAY_SIZE;
+         }
+
+         totalWidth += colSize[i-1];
+         
+         switch (sessObj.getDisplayFormat())
+         {
+            case SessionDefaults.RAW_FORMAT:
+               if (numColumns ==1)
+                  formatOutput(rsmd.getColumnName(i),colNameSize,' ',0);
+               else
+               {
+                  if(sessObj.getSessView() == SessionDefaults.MXCI_VIEW && i == numColumns && totalWidth > SessionDefaults.MXCI_TRIM_FIX)
+                      formatOutput(rsmd.getColumnName(i),colNameSize,' ',0);
+                  else
+                      formatOutput(rsmd.getColumnName(i),colSize[i-1],' ',0);
+               }
+               if (i < numColumns)
+               {
+                  writeSeparator();
+                  
+                  /* total width has to be added twice in MXCI mode b/c it has
+                   * two separators
+                   */
+                  if(sessObj.getSessView() == SessionDefaults.MXCI_VIEW)
+                      totalWidth++;
+                  
+                  totalWidth++;
+               }
+               break;
+
+            case SessionDefaults.XML_FORMAT:
+               columnNameArray[i-1] = sessObj.getXmlObj().checkColumnNames(utils.removeSpaces(rsmd.getColumnName(i)));
+               break;
+
+            case SessionDefaults.HTML_FORMAT:
+               formatHtmlOutput(rsmd.getColumnName(i));
+               break;
+
+            default:
+               break;
+         }
+
+         switch (rsmd.getColumnType(i))
+         {
+            case Types.BIGINT:
+            case Types.BIT:
+            case Types.DECIMAL:
+            case Types.DOUBLE:
+            case Types.FLOAT:
+            case Types.INTEGER:
+            case Types.NUMERIC:
+            case Types.REAL:
+            case Types.SMALLINT:
+            case Types.TINYINT:
+               colAlign[i-1]=1;
+               break;
+            default:
+               colAlign[i-1]=0;
+               break;
+
+         }
+      }
+
+      if (sessObj.getDisplayFormat() == SessionDefaults.RAW_FORMAT)
+      {
+         writeln();
+         for (int i=1;i<=numColumns ;i++)
+         {
+            formatOutput("",colSize[i-1],'-',0);
+            if (i < numColumns)
+            {
+               writeSeparator();
+            }
+         }
+         writeln();
+         if (sessObj.getSessView() == SessionDefaults.MXCI_VIEW)
+            writeln();
+      }
+   }
+
+   private void writeOutParams(ResultSetMetaData rsmd,int numColumns,ParameterMetaData paramMetaData,CallableStatement callStmt) throws SQLException, IOException
+   {
+      sessObj.setWriteParams(true);
+      columnNameArray = new String[numColumns];
+      colSize=new int[numColumns];
+      colAlign=new int[numColumns];
+      qryObj.setColCount(String.valueOf(numColumns));
+
+      if (qryObj.isTrimOut())
+      {
+         return;
+      }
+      for (int i=1;i<=numColumns;i++)
+      {
+         if (paramMetaData.getParameterMode(i) != ParameterMetaData.parameterModeIn &&
+            paramMetaData.getParameterMode(i) != ParameterMetaData.parameterModeUnknown)
+         {
+            int colNameSize = rsmd.getColumnName(i).length();
+            if (colNameSize > rsmd.getColumnDisplaySize(i))
+               colSize[i-1]=colNameSize;
+            else
+               colSize[i-1]=rsmd.getColumnDisplaySize(i);
+
+            if (colSize[i-1] < SessionDefaults.MIN_COL_DISPLAY_SIZE)
+            {
+               colSize[i-1] = SessionDefaults.MIN_COL_DISPLAY_SIZE;
+            }
+
+            switch (sessObj.getDisplayFormat())
+            {
+               case SessionDefaults.RAW_FORMAT:
+                  formatOutput(rsmd.getColumnName(i),colSize[i-1],' ',0);
+                  if (i < numColumns)
+                  {
+                     writeSeparator();
+                  }
+                  break;
+
+               case SessionDefaults.XML_FORMAT:
+                  columnNameArray[i-1] = sessObj.getXmlObj().checkColumnNames(rsmd.getColumnName(i));
+                  break;
+
+               case SessionDefaults.HTML_FORMAT:
+                  formatHtmlOutput(rsmd.getColumnName(i));
+                  break;
+
+               default:
+                  break;
+            }
+
+            switch (rsmd.getColumnType(i))
+            {
+               case Types.BIGINT:
+               case Types.BIT:
+               case Types.DECIMAL:
+               case Types.DOUBLE:
+               case Types.FLOAT:
+               case Types.INTEGER:
+               case Types.NUMERIC:
+               case Types.REAL:
+               case Types.SMALLINT:
+               case Types.TINYINT:
+                  colAlign[i-1]=1;
+                  break;
+               default:
+                  colAlign[i-1]=0;
+                  break;
+
+            }
+         }
+      }
+      if (sessObj.getDisplayFormat() == SessionDefaults.RAW_FORMAT)
+      {
+         writeln();
+         for (int i=1;i<=numColumns ;i++)
+         {
+            if (paramMetaData.getParameterMode(i) != ParameterMetaData.parameterModeIn &&
+               paramMetaData.getParameterMode(i) != ParameterMetaData.parameterModeUnknown)
+            {
+               formatOutput("",colSize[i-1],'-',0);
+               if (i < numColumns)
+               {
+                  writeSeparator();
+               }
+            }
+         }
+         writeln();
+
+         if (sessObj.getSessView() == SessionDefaults.MXCI_VIEW)
+            writeln();
+      }
+      writeData(callStmt,numColumns,paramMetaData);
+      qryObj.setRowCount("1");
+   }
+
+   private void writeData(CallableStatement callStmt,int numColumns, ParameterMetaData paramMetaData) throws SQLException, IOException
+   {
+      for (int i=1;i<=numColumns ;i++)
+      {
+         if (paramMetaData.getParameterMode(i) != ParameterMetaData.parameterModeIn &&
+            paramMetaData.getParameterMode(i) != ParameterMetaData.parameterModeUnknown)
+         {
+            String value=callStmt.getString(i);
+            if (value == null)
+            {
+               value=sessObj.getSessNull();
+            }
+            // bind the inout and out params
+            Integer paramIdxObj = new Integer(i);
+            if (inOutParamMap != null && inOutParamMap.containsKey(paramIdxObj))
+            {
+               sessObj.setSessParams(inOutParamMap.get(paramIdxObj).toString(),value);
+            }
+
+            switch (sessObj.getDisplayFormat())
+            {
+               case SessionDefaults.RAW_FORMAT :
+                  if (qryObj.isTrimOut())
+                  {
+                     formatOutput(value,value.length(),' ',0);
+                  }
+                  else
+                  {
+                     formatOutput(value,colSize[i-1],' ',colAlign[i-1]);
+                  }
+
+                  if (i < numColumns)
+                  {
+                     writeSeparator();
+                  }
+                  break;
+
+
+               case SessionDefaults.XML_FORMAT :
+                  formatXmlOutput(columnNameArray[i-1],value);
+                  break;
+
+               case SessionDefaults.HTML_FORMAT:
+                  formatHtmlOutput(value);
+                  break;
+
+               case SessionDefaults.CSV_FORMAT:
+                  formatCsvOutput(value);
+                  break;
+            }
+         }
+      }
+      inOutParamMap=null;
+      if (sessObj.getDisplayFormat() == SessionDefaults.RAW_FORMAT)
+         writeln();
+   }
+
+   private void writeAllSQLWarnings(SQLWarning sqlw) throws IOException
+   {
+      if (sqlw != null)
+      {
+         writer.writeAllSQLWarnings(sessObj,sqlw);
+         sessObj.setSqlWarningsCnt(sessObj.getSqlWarningsCnt()+1);
+      }
+   }
+
+   private void loadDbKeyWordMap()
+   {
+
+      if (dbKeyMap == null)
+      {
+         dbKeyMap = new HashMap<String, String>();
+      }
+
+      dbKeyMap.put("SET_SCHEMA",""+SessionDefaults.SET_SCHEMA);
+      dbKeyMap.put("SET_CATALOG",""+SessionDefaults.SET_CATALOG);
+      dbKeyMap.put("SET_SERVICE",""+SessionDefaults.SET_SERVICE);
+      dbKeyMap.put("CALL",""+SessionDefaults.CALL);
+      dbKeyMap.put("INFOSTATS",""+SessionDefaults.INFOSTATS);
+      dbKeyMap.put("PREPARE",""+SessionDefaults.PREPARE);
+      dbKeyMap.put("EXECUTE",""+SessionDefaults.EXECUTE);
+   }
+   
+   public boolean blockGetStats()
+   {
+      String query=null;
+      switch(qryObj.getQueryId())
+      {
+         case SessionDefaults.SET_SCHEMA:
+         case SessionDefaults.SET_CATALOG:
+            return true;
+            
+         case SessionDefaults.EXECUTE :
+            query = Utils.trimSQLTerminator(qryObj.getQueryText(),sessObj.getSessionSQLTerminator());
+            parser.setRemainderStr(query);
+            parser.getNextKeyToken();
+            String stmtName = parser.getNextPreparedStmtNameToken();
+            PreparedStatement pStmt = (PreparedStatement)sessObj.getPrepStmtMap(stmtName);
+            String sqlQueryStr=((TrafT4Statement)pStmt).getSQL();
+            if ((sqlQueryStr.matches("(?i)(?s)^SET\\s+SCHEMA.*")) ||
+                (sqlQueryStr.matches("(?i)(?s)^SET\\s+CATALOG.*")))
+               return true;
+            else
+               return false;
+               
+         default:
+               return false;
+         
+      }
+   }
+
+   private List<String> getParamNames(String qryString)
+   {
+      qryString=qryString+" ";
+      char[] rQryStr=qryString.toCharArray();
+      boolean quoteFound=false;
+      final char sQUOTE='\'';
+      final char dQUOTE='"';
+      final char pIDENTITY='?';
+      char currentQuote=sQUOTE;
+      boolean paramFound=false;
+      int paramStartPos=0;
+      List<String> paramList=new java.util.ArrayList<String>();
+
+
+      for (int i=0;i < rQryStr.length;i++)
+      {
+         // if we encounter quote skip all the characters till another quote.
+
+         if ((quoteFound && rQryStr[i] != sQUOTE && rQryStr[i] != dQUOTE)    ||
+            (quoteFound && rQryStr[i] == sQUOTE && currentQuote != sQUOTE)  ||
+            (quoteFound && rQryStr[i] == dQUOTE && currentQuote != dQUOTE))
+         {
+            continue;
+         }
+
+
+         if ((quoteFound && rQryStr[i] == sQUOTE && currentQuote == sQUOTE) ||
+            (quoteFound && rQryStr[i] == dQUOTE && currentQuote == dQUOTE))
+         {
+            quoteFound=false;
+            continue;
+         }
+
+         if ((!quoteFound && rQryStr[i] == sQUOTE) ||
+            (!quoteFound && rQryStr[i] == dQUOTE))
+         {
+            quoteFound = true;
+            currentQuote=rQryStr[i];
+            continue;
+         }
+
+         if (rQryStr[i] == pIDENTITY && !paramFound)
+         {
+            paramFound=true;
+            paramStartPos=i;
+            continue;
+         }
+
+         if (paramFound && ( ( (int)rQryStr[i] >= 97 && (int)rQryStr[i] <= 122 ) || ((int)rQryStr[i] >= 65 && (int)rQryStr[i] <= 91 ) ||
+            ((int)rQryStr[i] >= 48 && (int)rQryStr[i] <= 57 ) || rQryStr[i]=='_'  ))
+         {
+            continue;
+         }
+
+         if (paramFound)
+         {
+            paramList.add(qryString.substring(paramStartPos,i));
+            paramFound=false;
+            paramStartPos=0;
+         }
+
+      }
+      return paramList;
+
+   }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/de7e7d4e/core/conn/trafci/src/main/java/org/trafodion/ci/Display.java
----------------------------------------------------------------------
diff --git a/core/conn/trafci/src/main/java/org/trafodion/ci/Display.java b/core/conn/trafci/src/main/java/org/trafodion/ci/Display.java
new file mode 100644
index 0000000..892dae1
--- /dev/null
+++ b/core/conn/trafci/src/main/java/org/trafodion/ci/Display.java
@@ -0,0 +1,68 @@
+// @@@ START COPYRIGHT @@@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+// @@@ END COPYRIGHT @@@
+
+package org.trafodion.ci;
+
+import java.io.IOException;
+
+public class Display {
+
+	private Session sessObj;
+	private IDisplay rawDisplay;
+	private IDisplay xmlDisplay;
+	private IDisplay htmlDisplay;
+	private IDisplay csvDisplay;
+	
+	public Display(Session sessObj)
+	{
+		this.sessObj = sessObj;
+		rawDisplay = new RawDisplay(sessObj);
+		xmlDisplay = new XMLDisplay(sessObj);
+		htmlDisplay = new HTMLDisplay(sessObj);
+		csvDisplay = new CSVDisplay(sessObj);
+	}
+	
+	public void output(OutputContents contents) throws IOException
+	{
+		IDisplay display=rawDisplay;
+		switch (sessObj.getDisplayFormat())
+	      {
+	         //HTML Format
+	         case SessionDefaults.HTML_FORMAT:
+	        	 display=htmlDisplay;
+	        	 break;
+	         //XML Format
+	         case SessionDefaults.XML_FORMAT:
+	        	 display=xmlDisplay;
+	        	 break;
+	         //CSV Format
+	         case SessionDefaults.CSV_FORMAT:
+	        	 display=csvDisplay;
+	        	 break;
+	         //Default Raw Format
+	         default:
+	        	 display=rawDisplay;
+	        	 break;
+	      }
+		display.output(contents);
+	}
+	
+}

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/de7e7d4e/core/conn/trafci/src/main/java/org/trafodion/ci/DuplicateParamException.java
----------------------------------------------------------------------
diff --git a/core/conn/trafci/src/main/java/org/trafodion/ci/DuplicateParamException.java b/core/conn/trafci/src/main/java/org/trafodion/ci/DuplicateParamException.java
new file mode 100644
index 0000000..4c8a010
--- /dev/null
+++ b/core/conn/trafci/src/main/java/org/trafodion/ci/DuplicateParamException.java
@@ -0,0 +1,40 @@
+// @@@ START COPYRIGHT @@@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+// @@@ END COPYRIGHT @@@
+package org.trafodion.ci;
+
+public class DuplicateParamException extends Exception {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -3661178727942088670L;
+
+	DuplicateParamException()
+	{
+	
+	}
+	
+	DuplicateParamException(String msg)
+	{
+		super(msg);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/de7e7d4e/core/conn/trafci/src/main/java/org/trafodion/ci/ErrorObject.java
----------------------------------------------------------------------
diff --git a/core/conn/trafci/src/main/java/org/trafodion/ci/ErrorObject.java b/core/conn/trafci/src/main/java/org/trafodion/ci/ErrorObject.java
new file mode 100644
index 0000000..e3c778d
--- /dev/null
+++ b/core/conn/trafci/src/main/java/org/trafodion/ci/ErrorObject.java
@@ -0,0 +1,103 @@
+// @@@ START COPYRIGHT @@@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+// @@@ END COPYRIGHT @@@
+
+package org.trafodion.ci;
+
+public class ErrorObject {
+    private String errorCode = null;  
+    private String errorMessage = null;
+    public char errorType = 'E';
+    
+    public ErrorObject(String errorCode, String errorMessage) {
+        this.errorCode = errorCode;
+        this.errorMessage = errorMessage;
+        if (this.errorMessage.startsWith("*** WARNING["))
+           this.errorType = 'W'; 
+        else
+           this.errorType = 'E'; //Default
+    }
+    
+    public ErrorObject(String errorCode, String errorMessage, char errorType) {
+        this.errorCode = errorCode;
+        this.errorMessage = errorMessage;
+        this.errorType = errorType;
+    }
+    
+   // @Deprecated
+    //errStr may have no error code in itself
+    public ErrorObject(String errStr) {
+    	Parser parser = new Parser();
+    	this.errorCode = parser.getErrorCode(errStr);
+        this.errorMessage = parser.getErrorMsg(errStr);
+        /**
+         * Bug 2549: Expected warning message was converted into error 
+         * message by JDBC driver.
+         * Internal Analysis: some JDBC driver msg doesn't start with 
+         * *** [WARNING] will cause this error.
+         * Fix Description: instead of using startsWith, use indexOf method
+         */
+        if (errStr.indexOf("*** WARNING[" + errorCode + "]") > -1)
+           this.errorType = 'W'; 
+        else
+           this.errorType = 'E'; //Default
+    }
+
+    public ErrorObject(String errStr,int errorCode) {
+    	Parser parser = new Parser();
+		this.errorCode = parser.getErrorCode(errStr);
+        this.errorMessage = parser.getErrorMsg(errStr);
+		if (Parser.UNKNOWN_ERROR_CODE == this.errorCode)
+			this.errorCode = String.valueOf(Math.abs(errorCode));
+        /**
+         * Bug 2549: Expected warning message was converted into error 
+         * message by JDBC driver.
+         * Internal Analysis: some JDBC driver msg doesn't start with 
+         * *** [WARNING] will cause this error.
+         * Fix Description: instead of using startsWith, use indexOf method
+         */
+        if (errStr.indexOf("*** WARNING[" + errorCode + "]") > -1)
+           this.errorType = 'W'; 
+        else
+           this.errorType = 'E'; //Default
+    }
+    
+    public ErrorObject(ErrorObject errObj, String errStrPrefix, String errStrSuffix) {
+    	this.errorCode = errObj.errorCode;
+        this.errorMessage = errStrPrefix + errObj.errorMessage + errStrSuffix;
+        this.errorType = errObj.errorType;
+    }
+    
+    public String errorCode()   { return errorCode; }
+    
+    public String errorMessage() { return errorMessage; }
+
+    public String RAWOutputError() {
+    	String rawOutput = (this.errorType != 'E' || this.errorCode == Parser.UNKNOWN_ERROR_CODE) ? this.errorMessage : "*** ERROR[" + this.errorCode + "] " + this.errorMessage;
+      if (this.errorType == 'W') {
+          rawOutput =   "*** WARNING[" + this.errorCode + "] "+ this.errorMessage;        
+      }
+    	return (rawOutput);
+     }
+
+    public String toString() {
+         return this.RAWOutputError();
+      }
+}

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/de7e7d4e/core/conn/trafci/src/main/java/org/trafodion/ci/FCQuery.java
----------------------------------------------------------------------
diff --git a/core/conn/trafci/src/main/java/org/trafodion/ci/FCQuery.java b/core/conn/trafci/src/main/java/org/trafodion/ci/FCQuery.java
new file mode 100644
index 0000000..f67d5a7
--- /dev/null
+++ b/core/conn/trafci/src/main/java/org/trafodion/ci/FCQuery.java
@@ -0,0 +1,334 @@
+// @@@ START COPYRIGHT @@@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+// @@@ END COPYRIGHT @@@
+package org.trafodion.ci;
+
+import java.io.IOException;
+
+public class FCQuery
+{
+
+   private Reader        reader;
+   private Writer        writer;
+   private Session       sessObj;
+   private StringBuffer  qryText;
+   private StringBuffer  newQryText;
+
+   private int qryTextMaxLen;
+   private int qryTextPos;
+   private int commandPos;
+   private char[] fcCommand;
+
+   private String  fcPrompt;
+
+   final static int INSERT_O             =  0;
+   final static int DELETE_O             =  1;
+   final static int REPLACE_O            =  2;
+   final static int EXPLICIT_REPLACE_O   =  3;
+   final static int ADVANCE_O            =  4;
+   final static int ABORT_O              =  5;
+   final static int END_O                =  6;
+   final static int DONE_O               =  7;
+   final static int AGAIN_O              =  8;
+   final static int EMPTY_O              =  9;
+
+   /*enum Option
+   {
+   INSERT_O, DELETE_O, REPLACE_O, EXPLICIT_REPLACE_O, 
+   ADVANCE_O, ABORT_O, END_O, DONE_O, AGAIN_O, EMPTY_O
+   };*/
+
+   FCQuery(Session sessObj,Query qryObj)
+   {
+      this.sessObj = sessObj;
+      this.reader = sessObj.getReader();
+      this.writer = sessObj.getWriter();
+      this.setFcPrompt();
+   }
+
+   public boolean editCommand() throws IOException, UserInterruption
+   {
+      boolean returnVal = true;
+      newQryText = new StringBuffer();
+      int option;
+
+      String[] multiLineQry = sessObj.getQuery().getQueryText().split(SessionDefaults.lineSeperator);
+      for (int lineNo=0; lineNo < multiLineQry.length ;lineNo++)
+      {
+         if (sessObj.isQuietEnabled() || !sessObj.isLogCmdText()) {
+            writer.getConsoleWriter().println(sessObj.getSessionPrompt() + multiLineQry[lineNo]);
+            writer.getConsoleWriter().print(fcPrompt);
+         } 
+         if (sessObj.isLogCmdText()) {
+               writer.writeln(sessObj.getSessionPrompt() + multiLineQry[lineNo]); // print the line to be edited
+               writer.write(fcPrompt); //print the fc prompt 
+         }
+         //read the fc command
+         fcCommand= reader.getLine().toCharArray();
+         qryText = new StringBuffer(multiLineQry[lineNo]);
+         qryTextMaxLen = qryText.length();
+         qryTextPos=0;
+         commandPos=0;
+         option=-1;
+
+         while ((option != DONE_O) && (option != ABORT_O))
+         {
+            option = nextOption();
+            switch (option)
+            {
+               case INSERT_O:
+                  processInsert();
+                  break;
+
+               case REPLACE_O:
+                  processReplace();
+                  break;
+
+               case EXPLICIT_REPLACE_O:
+                  processReplace();
+                  qryTextPos++;
+                  break;
+
+               case DELETE_O:
+                  processDelete();
+                  break;
+
+               case ADVANCE_O:
+                  qryTextPos += 1;
+                  break;
+
+               case END_O:
+                  qryTextPos += 2;
+                  break;
+
+               case ABORT_O:
+                  returnVal = false;
+                  break;
+
+               case AGAIN_O:
+                  if (sessObj.isQuietEnabled() || !sessObj.isLogCmdText()) {
+                     writer.getConsoleWriter().println(sessObj.getSessionPrompt() + qryText);
+                     writer.getConsoleWriter().print(fcPrompt);
+                  }
+                  if (sessObj.isLogCmdText()) {
+                       writer.writeln(sessObj.getSessionPrompt() + qryText );
+                       writer.write(fcPrompt);
+                  }
+                  fcCommand= reader.getLine().toCharArray();
+
+                  if (!(fcCommand.length==0))
+                  {
+                     commandPos = 0;
+                     qryTextPos = 0;
+                  }
+                  else
+                  {
+                     option = DONE_O;
+                  }
+
+                  break;
+
+               case DONE_O:
+                  break;
+
+               default:
+                  break;
+
+            }//switch
+         }//while
+
+         if (option != ABORT_O)
+         {
+            if (newQryText.length() == 0)
+               newQryText.append(qryText);
+            else
+               newQryText.append(SessionDefaults.lineSeperator + qryText);
+         }
+         else
+         {
+            return false;
+         }
+      }//for
+      sessObj.getQuery().resetQueryText(newQryText.toString());
+      return returnVal;
+   }
+
+
+   private int nextOption()
+   {
+      int option;
+
+      //If the user just hits an enter key for the command, then we are done
+      //with editing the current qryText
+      if (fcCommand.length==0)
+      {
+         return (DONE_O);
+      }
+      // If you have reached the end of the FC command
+      // give another chance to edit the command
+      if (commandPos >= fcCommand.length)
+      {
+         return (AGAIN_O);
+      }
+
+      switch (fcCommand[commandPos])
+      {
+         case 'i':
+         case 'I':
+            option = INSERT_O;
+            commandPos += 1;
+            break;
+
+         case 'd':
+         case 'D':
+            option = DELETE_O;
+            commandPos += 1;
+            break;
+
+         case 'r':
+         case 'R':
+            option = EXPLICIT_REPLACE_O;
+            commandPos += 1;
+            break;
+
+         case ' ':
+            option = ADVANCE_O;
+            commandPos += 1;
+            break;
+
+         case '/':
+
+            if ((commandPos < fcCommand.length-1) && (fcCommand[commandPos+1] == '/'))
+            {
+               if ((commandPos == 0) && (fcCommand.length == 2))
+                  option = ABORT_O;
+               else
+               {
+                  option = END_O;
+                  commandPos += 2;
+               }
+            }
+            else
+            {
+               option = REPLACE_O;
+            }
+
+            break;
+
+         default:
+            option = REPLACE_O;
+            break;
+      }
+
+      return option;
+   }  // nextOption()
+
+   private int getCommandLen()
+   {
+      int done = 0;
+      int i = 0;
+
+      while (done != -1)
+      {
+         if (commandPos + i >= fcCommand.length)
+            done = -1;
+         else if ((commandPos +i < fcCommand.length-1) && (fcCommand[commandPos+i] == '/') &&
+            (fcCommand[commandPos+i+1] == '/'))
+            done = -1;
+         else
+            i++;
+      }
+      return i;
+   }  // getCommandLen
+
+   void processInsert()
+   {
+      int commandLen = getCommandLen();
+
+      if (commandLen > 0)
+      {
+         if (qryTextPos > qryText.length())
+         {
+            for (int j=qryText.length();j<qryTextPos;j++)
+               qryText.append(" ");
+            qryText.append(new String(fcCommand).substring(commandPos,commandPos+commandLen));
+         }
+         else
+            qryText = qryText.insert(qryTextPos, fcCommand, commandPos, commandLen);
+
+         commandPos += commandLen;
+         qryTextPos += 2 * commandLen + 1;
+         qryTextMaxLen += commandLen;
+
+         if (qryTextPos > qryTextMaxLen)
+            qryTextMaxLen = qryTextPos;
+
+      }
+   }  // processInsert()
+
+
+   private void processDelete()
+   {
+      if (qryTextPos < qryTextMaxLen)
+      {
+         //qryText=new StringBuffer(qryText.substring(0,qryTextPos)+qryText.substring(qryTextPos+1));
+         qryText = qryText.deleteCharAt(qryTextPos);
+         qryTextMaxLen-=1;
+      }
+
+   }
+
+   private void processReplace()
+   {
+      int commandLen = getCommandLen();
+
+      if (commandLen > 0)
+      {
+         if (qryTextPos > qryText.length())
+         {
+            for (int j=qryText.length();j<qryTextPos;j++)
+               qryText.append(" ");
+            qryText.append(new String(fcCommand).substring(commandPos,commandPos+commandLen));
+         }
+         else
+            qryText.replace(qryTextPos, qryTextPos+commandLen, new String(fcCommand).substring(commandPos,commandPos+commandLen));
+         commandPos += commandLen;
+         qryTextPos += commandLen;
+         if (qryTextPos > qryTextMaxLen)
+            qryTextMaxLen = qryTextPos;
+      }
+   }  // processReplace()
+
+
+   public String getFcPrompt()
+   {
+      return this.fcPrompt;
+   }
+
+
+   public void setFcPrompt()
+   {
+      int len = sessObj.getSessionPrompt().length();
+      String fcPrompt="";
+      for (int i=0;i<len;i++)
+         fcPrompt+=".";
+      this.fcPrompt = fcPrompt;
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/de7e7d4e/core/conn/trafci/src/main/java/org/trafodion/ci/FileReader.java
----------------------------------------------------------------------
diff --git a/core/conn/trafci/src/main/java/org/trafodion/ci/FileReader.java b/core/conn/trafci/src/main/java/org/trafodion/ci/FileReader.java
new file mode 100644
index 0000000..bf4dcde
--- /dev/null
+++ b/core/conn/trafci/src/main/java/org/trafodion/ci/FileReader.java
@@ -0,0 +1,176 @@
+// @@@ START COPYRIGHT @@@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+// @@@ END COPYRIGHT @@@
+package org.trafodion.ci;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+public class FileReader
+{
+   private BufferedReader br=null;
+   private String fileName=null;
+   private String line=null;
+   private boolean isSectionRead=false;
+//   private String sectionName=null;
+   String sectionLine=null;
+   private boolean isSectionLineRead=false;
+   Pattern sectionPat=null;
+   Matcher sectionMat=null;
+
+   FileReader()
+   {
+
+   }
+
+   public void initialize(String fileName) throws IOException
+   {
+      this.fileName=fileName;
+      java.io.FileReader fr=new java.io.FileReader(this.fileName);
+      this.br = new BufferedReader(fr);
+   }
+   
+   public void initializeStream(InputStream theStream, String clzName) throws IOException
+   {
+      this.fileName=clzName;
+      InputStreamReader ir= new InputStreamReader(theStream);
+      //dead code
+//      if (null == ir)
+//    	  throw new IOException("Unable to load stream from class '" + clzName + "' ");
+      this.br = new BufferedReader(ir);
+   }
+   
+
+   public String getLine() throws IOException
+   {
+      if (next(true))
+      {
+         return this.line;
+      }
+      else
+      {
+         return null;
+      }
+   }
+
+   public String getNonBlankLine() throws IOException
+   {
+      if (next(false))
+      {
+         return this.line;
+      }
+      else
+      {
+         return null;
+      }
+   }
+
+   public boolean next(boolean readBlanks) throws IOException
+   {
+
+      while (true)
+      {
+         // if section option is enabled , return the section line which was read already
+         // before reading the remaining lines from the file
+         if (this.isSectionRead && !this.isSectionLineRead)
+         {
+            line=this.sectionLine;
+            this.sectionLine=null;
+            this.isSectionLineRead=true;
+            return true;
+         }
+         line=this.br.readLine();
+         if (line == null)
+         {
+            return false;
+         }
+         else if (readBlanks)
+         {
+            return true;
+         }
+         else if (!line.trim().equals(""))
+         {
+            if (this.isSectionRead && line.trim().toUpperCase().startsWith("?SECTION"))
+            {
+               return false;
+            }
+            return true;
+         }
+      }
+   }
+
+   public String getFileName()
+   {
+      return this.fileName;
+   }
+
+   public void close() throws IOException
+   {
+      this.br.close();
+      this.br=null;
+   
+   }
+
+   public boolean isSectionRead()
+   {
+      return isSectionRead;
+   }
+
+   public void setSectionRead(boolean isSectionRead,String sectionName) throws IOException, ScriptSectionNotFound
+   {
+      if (isSectionRead && sectionName != null)
+      {
+         sectionPat=Pattern.compile("(?i)^\\s*\\?SECTION\\s+"+sectionName+"\\s*$");
+         seekToSection();
+//         this.sectionName=sectionName;
+         this.isSectionRead = isSectionRead;
+
+      }else
+      {
+//         this.sectionName=null;
+         this.isSectionRead = false;
+      }
+
+   }
+
+   private void seekToSection() throws IOException, ScriptSectionNotFound
+   {
+      String line=null;
+      while ((line=this.getNonBlankLine()) != null)
+      {
+         sectionMat=sectionPat.matcher(line);
+         if (sectionMat.find())
+         {
+            sectionLine=line;
+            //section found..
+            return;
+         }
+      }
+      throw new ScriptSectionNotFound();
+   }
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/de7e7d4e/core/conn/trafci/src/main/java/org/trafodion/ci/FileWriter.java
----------------------------------------------------------------------
diff --git a/core/conn/trafci/src/main/java/org/trafodion/ci/FileWriter.java b/core/conn/trafci/src/main/java/org/trafodion/ci/FileWriter.java
new file mode 100644
index 0000000..10c153f
--- /dev/null
+++ b/core/conn/trafci/src/main/java/org/trafodion/ci/FileWriter.java
@@ -0,0 +1,80 @@
+// @@@ START COPYRIGHT @@@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+// @@@ END COPYRIGHT @@@
+package org.trafodion.ci;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+
+public class FileWriter
+{
+   private BufferedWriter bw=null;
+   private boolean append=false;
+   private java.io.FileWriter fw=null;
+   FileWriter()
+   {
+
+   }
+
+   public void setAppend(boolean append)
+   {
+      this.append=append;
+   }
+
+   public void initialize(String fileName) throws IOException
+   {
+      fw=new java.io.FileWriter(fileName,append);
+      bw=new BufferedWriter(fw);
+   }
+
+   public void write(String line) throws IOException
+   {
+      if (line != null)
+      {
+         if (SessionDefaults.lineSeperator.equals(line))
+         {
+            writeln();
+         }
+         else
+         {
+            bw.write(line);
+         }
+         bw.flush();
+      }
+   }
+
+   public void writeln() throws IOException
+   {
+      bw.newLine();
+   }
+
+   public void writeln(String line) throws IOException
+   {
+      write(line);
+      writeln();
+   }
+
+   public void close() throws IOException
+   {
+      bw.close();
+      bw=null;
+      fw=null;
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/de7e7d4e/core/conn/trafci/src/main/java/org/trafodion/ci/HTMLDisplay.java
----------------------------------------------------------------------
diff --git a/core/conn/trafci/src/main/java/org/trafodion/ci/HTMLDisplay.java b/core/conn/trafci/src/main/java/org/trafodion/ci/HTMLDisplay.java
new file mode 100644
index 0000000..106d842
--- /dev/null
+++ b/core/conn/trafci/src/main/java/org/trafodion/ci/HTMLDisplay.java
@@ -0,0 +1,80 @@
+// @@@ START COPYRIGHT @@@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+// @@@ END COPYRIGHT @@@
+
+package org.trafodion.ci;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+public class HTMLDisplay implements IDisplay {
+
+	private Query qryObj;
+	private Writer writer=null;
+	private Session sessObj=null;
+	
+	public HTMLDisplay(Session sessObj)
+	{
+		if(sessObj!=null)
+		{
+			this.sessObj = sessObj;
+			this.writer=sessObj.getWriter();
+			this.qryObj=sessObj.getQuery();
+		}
+	}
+
+	public void output(OutputContents contents) throws IOException {
+		// TODO Auto-generated method stub
+		if(contents!=null)
+		{
+			this.writer=sessObj.getWriter();
+			this.qryObj=sessObj.getQuery();
+			//display header
+			ArrayList<OutputColumnAttribute> columns = contents.getColumns();
+			qryObj.setColCount(String.valueOf(columns.size()));
+			//display columns name
+			for(int i=0;i<columns.size();i++)
+			{
+				OutputColumnAttribute columnAttr = columns.get(i);
+				sessObj.getHtmlObj().processHtml(columnAttr.getDisplayFormatName());
+	            writer.writeln();
+			}
+			
+			ArrayList<ArrayList<String>> alRows = contents.getRows();
+			if(alRows!=null && alRows.size()>0)
+			{
+				for(int i=0;i<alRows.size();i++)
+				{
+					ArrayList<String> alRow = alRows.get(i);
+					if(alRow!=null && alRow.size()>0)
+					{
+						for(int j=0;j<alRow.size();j++)
+						{
+							sessObj.getHtmlObj().processHtml(alRow.get(j));
+				            writer.writeln();
+						}
+					}
+					
+				}
+			}
+		}
+	}
+
+}