private boolean validateColumnsRecurse(TExpression condition, TJoinList joins) {
   if (condition.getLeftOperand().getLeftOperand() == null
       && condition.getRightOperand().getLeftOperand() == null) {
     return validateColumns(condition.getLeftOperand().toString(), joins)
         .equals(validateColumns(condition.getRightOperand().toString(), joins));
   } else {
     return (validateColumnsRecurse(condition.getLeftOperand(), joins)
         && validateColumnsRecurse(condition.getRightOperand(), joins));
   }
 }
  public void selectCommand(String query) {
    int invalid = 0;
    String details = "Querytype:select\n";
    TGSqlParser tgSqlParser = new TGSqlParser(EDbVendor.dbvoracle);
    tgSqlParser.sqltext = query;
    tgSqlParser.parse();
    TSelectSqlStatement tSelectSqlStatement =
        (TSelectSqlStatement) tgSqlParser.sqlstatements.get(0);

    try {
      // Find number of tables in join. Invalid if no tables specified
      int noTabs = tSelectSqlStatement.joins.size();
      if (noTabs > 0) {
        if (!validateTables(tSelectSqlStatement)) // check for existing tables and its columns
        throw new NullPointerException();
        details = details + "Tablename:" + tSelectSqlStatement.joins.getJoin(0);
        for (int i = 1; i < noTabs; i++) {
          details = details + "," + tSelectSqlStatement.joins.getJoin(i);
        }
        details = details + "\n";
      }
      // find columns involved in select query

      int noCols = tSelectSqlStatement.getResultColumnList().size();
      String columnList = "";
      if (noCols > 0) {
        String column = tSelectSqlStatement.getResultColumnList().getResultColumn(0).toString();
        details = details + "Columns:";
        if (column.equals("*")) {
          columnList = getColumnName(tSelectSqlStatement.joins);
          details = details + columnList;
        } else {
          columnList =
              tSelectSqlStatement
                  .getResultColumnList()
                  .getResultColumn(0)
                  .toString()
                  .replace("(", "")
                  .replace(")", "");
          for (int i = 1; i < noCols; i++) {
            columnList =
                columnList
                    + ","
                    + tSelectSqlStatement
                        .getResultColumnList()
                        .getResultColumn(i)
                        .toString()
                        .replace("(", "")
                        .replace(")", "");
          }
          details = details + columnList;
        }
        details = details + "\n";
      }

      // Evaluate for distinct
      TSelectDistinct distinctClause = tSelectSqlStatement.getSelectDistinct();
      if (distinctClause != null) {
        details = details + "Distinct:" + columnList + "\n";
      } else details = details + "Distinct:NA\n";

      // Evaluate where clause
      TWhereClause wClause = tSelectSqlStatement.getWhereClause();
      if (wClause != null) {
        // System.out.println(wClause.getCondition().getLeftOperand());
        if (!validateColumnsRecurse(wClause.getCondition(), tSelectSqlStatement.joins))
          throw new NullPointerException();
        details = details + "Condition:" + wClause.getCondition().toString() + "\n";
      } else details = details + "Condition:NA\n";

      // evaluate order by
      TOrderBy orderBy = tSelectSqlStatement.getOrderbyClause();
      if (orderBy != null) {
        String result = validateColumns(orderBy.getItems().toString(), tSelectSqlStatement.joins);
        if (result.equals("int") || result.equals("invalid")) throw new NullPointerException();
        details = details + "OrderBy:" + orderBy.getItems().toString() + "\n";
      } else details = details + "OrderBy:NA\n";

      // evaluate group by
      TGroupBy groupBy = tSelectSqlStatement.getGroupByClause();
      if (groupBy != null) {
        String result = validateColumns(groupBy.getItems().toString(), tSelectSqlStatement.joins);
        if (result.equals("int") || result.equals("invalid")) throw new NullPointerException();
        details = details + "GroupBy:" + groupBy.getItems().toString() + "\n";

        // evaluate having clause {having occurs only with group by}
        TExpression havingClause = groupBy.getHavingClause();
        if (havingClause != null) {
          // result=validateColumns(havingClause.getLeftOperand().toString(),tSelectSqlStatement.joins);
          if (!validateColumnsRecurse(havingClause, tSelectSqlStatement.joins))
            throw new NullPointerException();
          details = details + "Having:" + havingClause.toString() + "\n";
        } else {
          details = details + "Having:NA\n";
        }
      } else details = details + "GroupBy:NA\nHaving:NA\n";

      System.out.print(details);
    } catch (NullPointerException e) {
      System.out.println("Query Invalid");
      // e.printStackTrace();
    }
  }