[teiid-commits] teiid SVN: r903 - in trunk: connector-api/src/main/java/org/teiid/connector/basic and 36 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Mon May 11 10:34:31 EDT 2009


Author: shawkins
Date: 2009-05-11 10:34:31 -0400 (Mon, 11 May 2009)
New Revision: 903

Added:
   trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertExpressionValueSource.java
   trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertValueSource.java
   trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/InsertValueExpressionsImpl.java
   trunk/engine/src/test/java/com/metamatrix/query/processor/TestInsertProcessing.java
Removed:
   trunk/connector-api/src/main/java/org/teiid/connector/language/IBulkInsert.java
   trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCConnector.java
   trunk/engine/src/main/java/com/metamatrix/query/sql/lang/BulkInsert.java
   trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/BulkInsertImpl.java
   trunk/engine/src/test/java/com/metamatrix/query/sql/lang/TestBulkInsert.java
   trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestBulkInsertImpl.java
Modified:
   trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorCapabilities.java
   trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnectorCapabilities.java
   trunk/connector-api/src/main/java/org/teiid/connector/language/IExpression.java
   trunk/connector-api/src/main/java/org/teiid/connector/language/IInsert.java
   trunk/connector-api/src/main/java/org/teiid/connector/language/ILanguageFactory.java
   trunk/connector-api/src/main/java/org/teiid/connector/language/ILiteral.java
   trunk/connector-api/src/main/java/org/teiid/connector/language/IQueryCommand.java
   trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/AbstractLanguageVisitor.java
   trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/HierarchyVisitor.java
   trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/LanguageObjectVisitor.java
   trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/CollectorVisitor.java
   trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLStringVisitor.java
   trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCBaseExecution.java
   trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCCapabilities.java
   trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCPropertyNames.java
   trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCQueryExecution.java
   trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCUpdateExecution.java
   trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/SimpleCapabilities.java
   trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/access/AccessCapabilities.java
   trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/db2/DB2Capabilities.java
   trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleCapabilities.java
   trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleSQLTranslator.java
   trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/SequeLinkOracleCapabilities.java
   trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/sqlserver/SqlServerCapabilities.java
   trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/sybase/SybaseCapabilities.java
   trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/teradata/TeradataCapabilities.java
   trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/BindValueVisitor.java
   trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/ReplacementVisitor.java
   trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java
   trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/TranslatedCommand.java
   trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/Translator.java
   trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnector.java
   trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnectorCapabilities.java
   trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnectorPropertyNames.java
   trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPUpdateExecution.java
   trunk/connectors/connector-ldap/src/main/resources/connector-ldap.xml
   trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Connector.java
   trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesforceCapabilities.java
   trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/visitors/InsertVisitor.java
   trunk/connectors/connector-salesforce/src/main/resources/connector-salesforce.xml
   trunk/engine/src/main/java/com/metamatrix/query/optimizer/capabilities/SourceCapabilities.java
   trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/PlanToProcessConverter.java
   trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleCollapseSource.java
   trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRaiseAccess.java
   trunk/engine/src/main/java/com/metamatrix/query/processor/relational/ProjectIntoNode.java
   trunk/engine/src/main/java/com/metamatrix/query/sql/LanguageVisitor.java
   trunk/engine/src/main/java/com/metamatrix/query/sql/lang/Insert.java
   trunk/engine/src/main/java/com/metamatrix/query/sql/navigator/PreOrPostOrderNavigator.java
   trunk/engine/src/main/java/com/metamatrix/query/sql/symbol/Constant.java
   trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/EvaluatableVisitor.java
   trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/EvaluateExpressionVisitor.java
   trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/SQLStringVisitor.java
   trunk/engine/src/main/java/com/metamatrix/query/tempdata/TempTableStoreImpl.java
   trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/CapabilitiesConverter.java
   trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/InsertImpl.java
   trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageBridgeFactory.java
   trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageFactoryImpl.java
   trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LiteralImpl.java
   trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/ProcedureImpl.java
   trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/SetClauseImpl.java
   trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/SetClauseListImpl.java
   trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java
   trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java
   trunk/engine/src/test/java/com/metamatrix/query/processor/relational/TestProjectIntoNode.java
   trunk/engine/src/test/java/com/metamatrix/query/sql/symbol/TestConstant.java
   trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestInsertImpl.java
   trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestCallableStatement.java
   trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java
   trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatementBatchedUpdate.java
Log:
TEIID-525 TEIID-124 TEIID-572 removing redundant max in property overrides, adding pushdown of insert with a query expression, and adding full pushdown of all bulk update operations.

Modified: trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorCapabilities.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorCapabilities.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/api/ConnectorCapabilities.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -25,7 +25,7 @@
 import java.util.List;
 
 import org.teiid.connector.language.IBatchedUpdates;
-import org.teiid.connector.language.IBulkInsert;
+import org.teiid.connector.language.ISetQuery;
 
 
 /**
@@ -372,9 +372,16 @@
     boolean supportsBatchedUpdates();
     
     /**
-     * Whether the source supports {@link IBulkInsert}
+     * Whether the source supports updates with multiple value sets
      * @since 6.0
      */
-    boolean supportsBulkInsert();
+    boolean supportsBulkUpdate();
+    
+    /**
+     * Support indicates that the connector can accept INSERTs with
+     * values specified by an {@link ISetQuery}.
+     * @since 6.1
+     */
+    boolean supportsInsertWithQueryExpression();
         
 }

Modified: trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnectorCapabilities.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnectorCapabilities.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/basic/BasicConnectorCapabilities.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -35,8 +35,6 @@
  */
 public class BasicConnectorCapabilities implements ConnectorCapabilities {
     
-    protected int maxInCriteriaSize = -1;
-    
     /**
      * Construct the basic capabilities class.
      */
@@ -272,7 +270,7 @@
      * @since 4.2
      */
     public int getMaxInCriteriaSize() {
-        return this.maxInCriteriaSize;
+        return -1;
     }
     
     /** 
@@ -335,11 +333,6 @@
 	}
 
 	@Override
-	public boolean supportsBulkInsert() {
-		return false;
-	}
-	
-	@Override
 	public boolean supportsGroupBy() {
 		return false;
 	}
@@ -368,5 +361,15 @@
 	public boolean supportsCompareCriteriaOrdered() {
 		return false;
 	}
+
+	@Override
+	public boolean supportsInsertWithQueryExpression() {
+		return false;
+	}
 	
+	@Override
+	public boolean supportsBulkUpdate() {
+		return false;
+	}
+	
 }

Deleted: trunk/connector-api/src/main/java/org/teiid/connector/language/IBulkInsert.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/language/IBulkInsert.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/language/IBulkInsert.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -1,39 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.connector.language;
-
-import java.util.List;
-
-/**
- * This is a simple variation of insert, where multiple rows with single insert 
- * will be loaded.
- */
-public interface IBulkInsert extends IInsert {
-        
-    /**
-     * Get the list of row values for this bulk insert  
-     * @return list; never null
-     */
-    List<List<?>> getRows();
-    
-}

Modified: trunk/connector-api/src/main/java/org/teiid/connector/language/IExpression.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/language/IExpression.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/language/IExpression.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -30,21 +30,17 @@
 public interface IExpression extends ILanguageObject {
 
     /**
-     * Determine the type returned by this expression.  The connector should
-     * return an object of this type if this expression is used in a SELECT 
-     * clause.  
+     * Determine the type returned by this expression.
      * 
      * @return The type, as defined by a Java class
      */
-    Class getType();
+    Class<?> getType();
 
     /**
-     * Set the type returned by this expression.  The connector should
-     * return an object of this type if this expression is used in a SELECT 
-     * clause.  
+     * Set the type returned by this expression.
      * 
      * @param type The type, as defined by a Java class
      */
-    void setType(Class type);
+    void setType(Class<?> type);
     
 }

Modified: trunk/connector-api/src/main/java/org/teiid/connector/language/IInsert.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/language/IInsert.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/language/IInsert.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -42,12 +42,18 @@
     List<IElement> getElements();
     
     /**
-     * Get list of values being inserted
-     * @return List of ILiteral
+     * Get the IInsertValues
+     * @return
      */
-    List<IExpression> getValues();
+    IInsertValueSource getValueSource();
     
     /**
+     * Set the IInsertValues
+     * @param values
+     */
+    void setValueSource(IInsertValueSource values);
+        
+    /**
      * Set group that is being inserted into.
      * @param group Insert group
      */

Added: trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertExpressionValueSource.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertExpressionValueSource.java	                        (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertExpressionValueSource.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -0,0 +1,9 @@
+package org.teiid.connector.language;
+
+import java.util.List;
+
+public interface IInsertExpressionValueSource extends IInsertValueSource, ILanguageObject {
+	
+	List<IExpression> getValues();
+
+}


Property changes on: trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertExpressionValueSource.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertValueSource.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertValueSource.java	                        (rev 0)
+++ trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertValueSource.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -0,0 +1,5 @@
+package org.teiid.connector.language;
+
+public interface IInsertValueSource extends ILanguageObject {
+
+}


Property changes on: trunk/connector-api/src/main/java/org/teiid/connector/language/IInsertValueSource.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: trunk/connector-api/src/main/java/org/teiid/connector/language/ILanguageFactory.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/language/ILanguageFactory.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/language/ILanguageFactory.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -106,7 +106,7 @@
      * @param type Data type returned
      * @return New IFunction
      */
-    IFunction createFunction(String functionName, IExpression[] args, Class type);
+    IFunction createFunction(String functionName, IExpression[] args, Class<?> type);
     
     /**
      * Create new function
@@ -115,7 +115,7 @@
      * @param type Data type returned
      * @return New IFunction
      */
-    IFunction createFunction(String functionName, List<? extends IExpression> args, Class type);
+    IFunction createFunction(String functionName, List<? extends IExpression> args, Class<?> type);
 
     /**
      * Create new group.
@@ -157,16 +157,14 @@
      * @param values List of IExpression (usually ILiteral)
      * @return New IInsert
      */
-    IInsert createInsert(IGroup group, List<IElement> columns, List<? extends IExpression> values);
+    IInsert createInsert(IGroup group, List<IElement> columns, IInsertValueSource valueSource);
  
     /**
-     * Create new bulk insert command
-     * @param group Insert group
-     * @param columns List of IElement being inserted into
-     * @param List of Lists containing the actual values
-     * @return New IBulkInsert
+     * Create a new value source for an insert command
+     * @param values
+     * @return
      */
-    IBulkInsert createBulkInsert(IGroup group, List<? extends IElement> columns, List<List<Object>> rows);
+    IInsertExpressionValueSource createInsertExpressionValueSource(List<IExpression> values);
     
     /**
      * Create new IS NULL criteria

Modified: trunk/connector-api/src/main/java/org/teiid/connector/language/ILiteral.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/language/ILiteral.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/language/ILiteral.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -38,7 +38,7 @@
      * Get the Java type of the literal
      * @return Java class name of type
      */
-    Class getType();  
+    Class<?> getType();  
     
     /**
      * Set the value of the literal 
@@ -50,13 +50,29 @@
      * Set the Java type of the literal
      * @param type Java class name of type
      */
-    void setType(Class type);
+    void setType(Class<?> type);
     
     /**
      * Returns true if this literal should be treated as a bind value
      */
     boolean isBindValue();
     
+    /**
+     * Set whether this literal should be treated as a bind value
+     * @param bindValue
+     */
     void setBindValue(boolean bindValue);
+    
+    /**
+     * Returns true if the value for this literal is a list of values.
+     * @return
+     */
+    boolean isMultiValued();
+    
+    /**
+     * Set whether the value for this literal is a list of values.
+     * @param multiValued
+     */
+    void setMultiValued(boolean multiValued);
      
 }

Modified: trunk/connector-api/src/main/java/org/teiid/connector/language/IQueryCommand.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/language/IQueryCommand.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/language/IQueryCommand.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -22,7 +22,7 @@
 
 package org.teiid.connector.language;
 
-public interface IQueryCommand extends ICommand {
+public interface IQueryCommand extends ICommand, IInsertValueSource {
     
     /**
      * Set ORDER BY clause, may be null.

Modified: trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/AbstractLanguageVisitor.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/AbstractLanguageVisitor.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/AbstractLanguageVisitor.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -26,7 +26,6 @@
 
 import org.teiid.connector.language.IAggregate;
 import org.teiid.connector.language.IBatchedUpdates;
-import org.teiid.connector.language.IBulkInsert;
 import org.teiid.connector.language.ICompareCriteria;
 import org.teiid.connector.language.ICompoundCriteria;
 import org.teiid.connector.language.IDelete;
@@ -39,6 +38,7 @@
 import org.teiid.connector.language.IInCriteria;
 import org.teiid.connector.language.IInlineView;
 import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
 import org.teiid.connector.language.IIsNullCriteria;
 import org.teiid.connector.language.IJoin;
 import org.teiid.connector.language.ILanguageObject;
@@ -129,7 +129,7 @@
     public void visit(IInCriteria obj) {}
     public void visit(IInlineView obj) {}
     public void visit(IInsert obj) {}
-    public void visit(IBulkInsert obj) {}
+    public void visit(IInsertExpressionValueSource obj) {}
     public void visit(IIsNullCriteria obj) {}
     public void visit(IJoin obj) {}
     public void visit(ILikeCriteria obj) {}

Modified: trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/HierarchyVisitor.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/HierarchyVisitor.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/HierarchyVisitor.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -34,6 +34,7 @@
 import org.teiid.connector.language.IInCriteria;
 import org.teiid.connector.language.IInlineView;
 import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
 import org.teiid.connector.language.IIsNullCriteria;
 import org.teiid.connector.language.IJoin;
 import org.teiid.connector.language.ILikeCriteria;
@@ -41,6 +42,7 @@
 import org.teiid.connector.language.IOrderBy;
 import org.teiid.connector.language.IProcedure;
 import org.teiid.connector.language.IQuery;
+import org.teiid.connector.language.IQueryCommand;
 import org.teiid.connector.language.IScalarSubquery;
 import org.teiid.connector.language.ISearchedCaseExpression;
 import org.teiid.connector.language.ISelect;
@@ -127,9 +129,16 @@
     public void visit(IInsert obj) {
         visitNode(obj.getGroup());
         visitNodes(obj.getElements());
-        visitNodes(obj.getValues());
+        if (!(obj.getValueSource() instanceof IQueryCommand) || visitSubcommands) {
+    		visitNode(obj.getValueSource());
+        }
     }
     
+    @Override
+    public void visit(IInsertExpressionValueSource obj) {
+    	visitNodes(obj.getValues());
+    }
+    
     public void visit(IIsNullCriteria obj) {
         visitNode(obj.getExpression());
     }

Modified: trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/LanguageObjectVisitor.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/LanguageObjectVisitor.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/visitor/framework/LanguageObjectVisitor.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -29,7 +29,7 @@
 public interface LanguageObjectVisitor {
     public void visit(IAggregate obj);
     public void visit(IBatchedUpdates obj);
-    public void visit(IBulkInsert obj);
+    public void visit(IInsertExpressionValueSource obj);
     public void visit(ICompareCriteria obj);
     public void visit(ICompoundCriteria obj);
     public void visit(IDelete obj);

Modified: trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/CollectorVisitor.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/CollectorVisitor.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/CollectorVisitor.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -22,9 +22,48 @@
 
 package org.teiid.connector.visitor.util;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
 
-import org.teiid.connector.language.*;
+import org.teiid.connector.language.IAggregate;
+import org.teiid.connector.language.IBatchedUpdates;
+import org.teiid.connector.language.ICompareCriteria;
+import org.teiid.connector.language.ICompoundCriteria;
+import org.teiid.connector.language.IDelete;
+import org.teiid.connector.language.IElement;
+import org.teiid.connector.language.IExistsCriteria;
+import org.teiid.connector.language.IFrom;
+import org.teiid.connector.language.IFunction;
+import org.teiid.connector.language.IGroup;
+import org.teiid.connector.language.IGroupBy;
+import org.teiid.connector.language.IInCriteria;
+import org.teiid.connector.language.IInlineView;
+import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
+import org.teiid.connector.language.IIsNullCriteria;
+import org.teiid.connector.language.IJoin;
+import org.teiid.connector.language.ILanguageObject;
+import org.teiid.connector.language.ILikeCriteria;
+import org.teiid.connector.language.ILimit;
+import org.teiid.connector.language.ILiteral;
+import org.teiid.connector.language.INotCriteria;
+import org.teiid.connector.language.IOrderBy;
+import org.teiid.connector.language.IOrderByItem;
+import org.teiid.connector.language.IParameter;
+import org.teiid.connector.language.IProcedure;
+import org.teiid.connector.language.IQuery;
+import org.teiid.connector.language.IScalarSubquery;
+import org.teiid.connector.language.ISearchedCaseExpression;
+import org.teiid.connector.language.ISelect;
+import org.teiid.connector.language.ISelectSymbol;
+import org.teiid.connector.language.ISetClause;
+import org.teiid.connector.language.ISetClauseList;
+import org.teiid.connector.language.ISetQuery;
+import org.teiid.connector.language.ISubqueryCompareCriteria;
+import org.teiid.connector.language.ISubqueryInCriteria;
+import org.teiid.connector.language.IUpdate;
 import org.teiid.connector.visitor.framework.DelegatingHierarchyVisitor;
 import org.teiid.connector.visitor.framework.LanguageObjectVisitor;
 
@@ -153,7 +192,7 @@
     /* 
      * @see com.metamatrix.data.visitor.framework.LanguageObjectVisitor#visit(com.metamatrix.data.language.IBulkInsert)
      */
-    public void visit(IBulkInsert obj) {
+    public void visit(IInsertExpressionValueSource obj) {
         checkInstance(obj);
     }
     /* 

Modified: trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLStringVisitor.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLStringVisitor.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLStringVisitor.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -27,7 +27,6 @@
 
 import org.teiid.connector.api.ConnectorException;
 import org.teiid.connector.language.IAggregate;
-import org.teiid.connector.language.IBulkInsert;
 import org.teiid.connector.language.ICommand;
 import org.teiid.connector.language.ICompareCriteria;
 import org.teiid.connector.language.ICompoundCriteria;
@@ -44,6 +43,7 @@
 import org.teiid.connector.language.IInCriteria;
 import org.teiid.connector.language.IInlineView;
 import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
 import org.teiid.connector.language.IIsNullCriteria;
 import org.teiid.connector.language.IJoin;
 import org.teiid.connector.language.ILanguageObject;
@@ -124,11 +124,11 @@
      */
     protected void append(List<? extends ILanguageObject> items) {
         if (items != null && items.size() != 0) {
-            append((ILanguageObject)items.get(0));
+            append(items.get(0));
             for (int i = 1; i < items.size(); i++) {
                 buffer.append(COMMA)
                       .append(SPACE);
-                append((ILanguageObject)items.get(i));
+                append(items.get(i));
             }
         }
     }
@@ -538,57 +538,35 @@
      * @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(org.teiid.connector.language.IInsert)
      */
     public void visit(IInsert obj) {
-        formatBasicInsert(obj);
-        buffer.append(SPACE)
-              .append(VALUES)
-              .append(SPACE)
-              .append(LPAREN);
-        append(obj.getValues());
-        buffer.append(RPAREN);  
-    }
-    
-    /**
-     * @param obj
-     */
-    private void formatBasicInsert(IInsert obj) {
-        buffer.append(INSERT)
-              .append(SPACE);
-        buffer.append(getSourceComment(obj));
-        buffer.append(INTO)
-              .append(SPACE);
-        append(obj.getGroup());
-        if (obj.getElements() != null && obj.getElements().size() != 0) {
-            buffer.append(SPACE)
-                  .append(LPAREN);
+    	buffer.append(INSERT).append(SPACE);
+		buffer.append(getSourceComment(obj));
+		buffer.append(INTO).append(SPACE);
+		append(obj.getGroup());
+		if (obj.getElements() != null && obj.getElements().size() != 0) {
+			buffer.append(SPACE).append(LPAREN);
 
-            int elementCount= obj.getElements().size();
-            for(int i=0; i<elementCount; i++) {
-           		buffer.append(getElementName(obj.getElements().get(i), false));
-                if (i<elementCount-1) {
-                    buffer.append(COMMA);
-                    buffer.append(SPACE);
-                }
-            }            
+			int elementCount = obj.getElements().size();
+			for (int i = 0; i < elementCount; i++) {
+				buffer.append(getElementName(obj.getElements().get(i), false));
+				if (i < elementCount - 1) {
+					buffer.append(COMMA);
+					buffer.append(SPACE);
+				}
+			}
 
-            buffer.append(RPAREN);
-        }
+			buffer.append(RPAREN);
+		}
+        buffer.append(SPACE);
+        append(obj.getValueSource());
     }
     
-    public void visit(IBulkInsert obj) {
-        formatBasicInsert(obj);
-        buffer.append(SPACE)
-              .append(VALUES)
-              .append(SPACE)
-              .append(LPAREN);
-        int elementCount= obj.getElements().size();
-        for(int i=0; i<elementCount; i++) {
-            buffer.append(UNDEFINED_PARAM);
-            if (i<elementCount-1) {
-                buffer.append(COMMA);
-            }
-        }
-        buffer.append(RPAREN);  
-    }    
+    @Override
+	public void visit(IInsertExpressionValueSource obj) {
+		buffer.append(VALUES).append(SPACE).append(LPAREN);
+		append(obj.getValues());
+		buffer.append(RPAREN);
+	}
+        
     /**
      * @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(org.teiid.connector.language.IIsNullCriteria)
      */
@@ -720,7 +698,9 @@
      * @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(org.teiid.connector.language.ILiteral)
      */
     public void visit(ILiteral obj) {
-        if (obj.getValue() == null) {
+    	if (obj.isBindValue()) {
+    		buffer.append("?"); //$NON-NLS-1$
+    	} else if (obj.getValue() == null) {
             buffer.append(NULL);
         } else {
             Class type = obj.getType();

Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCBaseExecution.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCBaseExecution.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCBaseExecution.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -28,6 +28,7 @@
 import java.sql.SQLException;
 import java.sql.SQLWarning;
 import java.sql.Statement;
+import java.util.List;
 import java.util.Properties;
 
 import org.teiid.connector.api.ConnectorException;
@@ -39,6 +40,7 @@
 import org.teiid.connector.jdbc.translator.TranslatedCommand;
 import org.teiid.connector.jdbc.translator.Translator;
 import org.teiid.connector.language.ICommand;
+import org.teiid.connector.language.ILiteral;
 
 import com.metamatrix.common.util.PropertiesUtils;
 
@@ -90,7 +92,29 @@
         	fetchSize = Math.min(fetchSize, maxResultRows);
         }
     }
+    
+    /**
+     * Return true if this is a batched update
+     */
+    protected void bindPreparedStatementValues(PreparedStatement stmt, TranslatedCommand tc, int rowCount) throws SQLException {
+        List params = tc.getPreparedValues();
 
+        for (int row = 0; row < rowCount; row++) {
+	        for (int i = 0; i< params.size(); i++) {
+	            ILiteral paramValue = (ILiteral)params.get(i);
+	            Object value = paramValue.getValue();
+	            if (paramValue.isMultiValued()) {
+	            	value = ((List<?>)value).get(row);
+	            }
+	            Class paramType = paramValue.getType();
+	            sqlTranslator.bindValue(stmt, value, paramType, i+1);
+	            if (rowCount > 1) {
+	            	stmt.addBatch();
+	            }
+	        }          
+        }
+    }
+
     // ===========================================================================================================================
     // Methods
     // ===========================================================================================================================

Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCCapabilities.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCCapabilities.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -32,19 +32,16 @@
  */
 public class JDBCCapabilities extends BasicConnectorCapabilities {
     
-    public static final int DEFAULT_JDBC_MAX_IN_CRITERIA_SIZE = 1000;
-
     /**
      * 
      */
     public JDBCCapabilities() {
-        this.setMaxInCriteriaSize(DEFAULT_JDBC_MAX_IN_CRITERIA_SIZE);
     }
 
     /* 
      * @see com.metamatrix.data.ConnectorCapabilities#getSupportedFunctions()
      */
-    public List getSupportedFunctions() {
+    public List<String> getSupportedFunctions() {
         return Arrays.asList(new String[] { "+", "-", "*", "/" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
     }
 
@@ -53,13 +50,9 @@
      * @since 4.2
      */
     public int getMaxInCriteriaSize() {
-        return maxInCriteriaSize;
+        return 1000;
     }
     
-    public void setMaxInCriteriaSize(int maxInCriteriaSize) {
-        this.maxInCriteriaSize = maxInCriteriaSize;
-    }
-    
     @Override
     public boolean supportsGroupBy() {
     	return true;
@@ -291,7 +284,7 @@
     }
     
     @Override
-    public boolean supportsBulkInsert() {
+    public boolean supportsBulkUpdate() {
     	return true;
     }
     
@@ -324,5 +317,10 @@
     public boolean supportsSelectExpression() {
     	return true;
     }
+    
+    @Override
+    public boolean supportsInsertWithQueryExpression() {
+    	return true;
+    }
 
 }

Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCPropertyNames.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCPropertyNames.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCPropertyNames.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -36,14 +36,6 @@
     public static final String TRIM_STRINGS = "TrimStrings"; //$NON-NLS-1$
 
     /**
-    * This is the property name of the ConnectorService property that defines
-    * the size of a SetCriteria (IN criteria) before the criteria is broken into 
-    * multiple queries and the results are aggregated.  0 indicates that set 
-    * criteria should never be broken.  The default value should be 0.
-    */
-    public static final String SET_CRITERIA_BATCH_SIZE = "SetCriteriaBatchSize"; //$NON-NLS-1$
-
-    /**
      * This is the property name used to set the transaction isolation level on
      * a connector's data source.  The value string must be the the same as one of the
      * names of the values of the transaction isolation levels defined in

Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCQueryExecution.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCQueryExecution.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCQueryExecution.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -93,7 +93,7 @@
                 results = getStatement().executeQuery(sql);
             } else {
             	PreparedStatement pstatement = getPreparedStatement(sql);
-                sqlTranslator.bindPreparedStatementValues(this.connection, pstatement, translatedComm);
+                bindPreparedStatementValues(pstatement, translatedComm, 1);
                 results = pstatement.executeQuery();
             } 
             addStatementWarnings();

Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCUpdateExecution.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCUpdateExecution.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/JDBCUpdateExecution.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -37,8 +37,8 @@
 import org.teiid.connector.jdbc.translator.TranslatedCommand;
 import org.teiid.connector.jdbc.translator.Translator;
 import org.teiid.connector.language.IBatchedUpdates;
-import org.teiid.connector.language.IBulkInsert;
 import org.teiid.connector.language.ICommand;
+import org.teiid.connector.language.ILiteral;
 
 
 /**
@@ -71,15 +71,13 @@
 
     @Override
     public void execute() throws ConnectorException {
-        if (command instanceof IBulkInsert) {
-            result = new int [] {execute((IBulkInsert)command)};
-        } else if (command instanceof IBatchedUpdates) {
+        if (command instanceof IBatchedUpdates) {
         	result = execute(((IBatchedUpdates)command));
         } else {
             // translate command
             TranslatedCommand translatedComm = translateCommand(command);
 
-            result = new int [] {executeTranslatedCommand(translatedComm)};
+            result = executeTranslatedCommand(translatedComm);
         }
     }
 
@@ -119,7 +117,7 @@
                         }
                         pstmt = getPreparedStatement(command.getSql());
                     }
-                    sqlTranslator.bindPreparedStatementValues(this.connection, pstmt, command);
+                    bindPreparedStatementValues(pstmt, command, 1);
                     pstmt.addBatch();
                 } else {
                     if (previousCommand != null && previousCommand.isPrepared()) {
@@ -149,44 +147,6 @@
         return results;
     }
 
-    /**
-     * An implementation to bulk insert rows into single table.
-     * 
-     * @param command
-     * @return
-     * @throws ConnectorException
-     */
-    public int execute(IBulkInsert command) throws ConnectorException {
-        boolean succeeded = false;
-
-        // translate command
-        TranslatedCommand translatedComm = translateCommand(command);
-
-        // create statement or PreparedStatement and execute
-        String sql = translatedComm.getSql();
-
-        boolean commitType = getAutoCommit(translatedComm);
-        int updateCount = -1;
-        try {
-            // temporarily turn the auto commit off, and set it back to what it was
-            // before at the end of the command execution.
-            if (commitType) {
-                connection.setAutoCommit(false);
-            }
-            PreparedStatement stmt = getPreparedStatement(sql);
-            updateCount = sqlTranslator.executeStatementForBulkInsert(this.connection, stmt, translatedComm);
-            addStatementWarnings();
-            succeeded = true;
-        } catch (SQLException e) {
-        	throw new JDBCExecutionException(e, translatedComm);
-        } finally {
-            if (commitType) {
-                restoreAutoCommit(!succeeded, translatedComm);
-            }
-        }
-        return updateCount;
-    }
-
     private void executeBatch(int commandCount,
                               int[] results,
                               List<TranslatedCommand> commands) throws ConnectorException {
@@ -198,7 +158,7 @@
             }
             commands.clear();
         } catch (SQLException err) {
-            throw new JDBCExecutionException(err, commands.toArray(new TranslatedCommand[commands.size()])); //$NON-NLS-1$
+            throw new JDBCExecutionException(err, commands.toArray(new TranslatedCommand[commands.size()]));
         }
     }
 
@@ -207,23 +167,51 @@
      * @throws ConnectorException
      * @since 4.3
      */
-    private int executeTranslatedCommand(TranslatedCommand translatedComm) throws ConnectorException {
+    private int[] executeTranslatedCommand(TranslatedCommand translatedComm) throws ConnectorException {
         // create statement or PreparedStatement and execute
         String sql = translatedComm.getSql();
-
+        boolean commitType = false;
+        boolean succeeded = false;
         try {
-        	int updateCount;
+        	int updateCount = 0;
             if (!translatedComm.isPrepared()) {
                 updateCount = getStatement().executeUpdate(sql);
             } else {
             	PreparedStatement pstatement = getPreparedStatement(sql);
-                sqlTranslator.bindPreparedStatementValues(this.connection, pstatement, translatedComm);
-                updateCount = pstatement.executeUpdate();
+                int rowCount = 1;
+                for (int i = 0; i< translatedComm.getPreparedValues().size(); i++) {
+                    ILiteral paramValue = (ILiteral)translatedComm.getPreparedValues().get(i);
+                    if (paramValue.isMultiValued()) {
+                    	rowCount = ((List<?>)paramValue).size();
+                    	break;
+                    }
+                }
+                if (rowCount > 1) {
+                    commitType = getAutoCommit(translatedComm);
+                    if (commitType) {
+                        connection.setAutoCommit(false);
+                    }
+                }
+                bindPreparedStatementValues(pstatement, translatedComm, rowCount);
+            	if (rowCount > 1) {
+                    int[] results = pstatement.executeBatch();
+                    
+                    for (int i=0; i<results.length; i++) {
+                        updateCount += results[i];
+                    }
+                    succeeded = true;
+            	} else {
+            		updateCount = pstatement.executeUpdate();
+            	}
             } 
             addStatementWarnings();
-            return updateCount;
+            return new int[] {updateCount};
         } catch (SQLException err) {
         	throw new JDBCExecutionException(err, translatedComm);
+        } finally {
+        	if (commitType) {
+                restoreAutoCommit(!succeeded, translatedComm);
+            }
         }
     }
 
@@ -253,9 +241,14 @@
             if (exceptionOccurred) {
                 connection.rollback();
             }
-            connection.setAutoCommit(true);
         } catch (SQLException err) {
         	throw new JDBCExecutionException(err, command);
+        } finally {
+        	try {
+        		connection.setAutoCommit(true);
+        	} catch (SQLException err) {
+            	throw new JDBCExecutionException(err, command);
+            }
         }
     }
     

Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/SimpleCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/SimpleCapabilities.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/SimpleCapabilities.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -34,10 +34,13 @@
 public class SimpleCapabilities extends JDBCCapabilities {
 
     public SimpleCapabilities() {
-        // Max acceptable by all BQT dbs (Sybase=250, Oracle=1000)
-        setMaxInCriteriaSize(250);
     }
     
+    @Override
+    public int getMaxInCriteriaSize() {
+    	return 250;
+    }
+    
     /* 
      * @see com.metamatrix.data.api.ConnectorCapabilities#supportsCompareCriteriaEquals()
      */
@@ -262,5 +265,10 @@
     public boolean supportsUnions() {
         return false;
     }
+    
+    @Override
+    public boolean supportsInsertWithQueryExpression() {
+    	return false;
+    }
 
 }

Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/access/AccessCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/access/AccessCapabilities.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/access/AccessCapabilities.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -37,5 +37,10 @@
     public boolean supportsRowLimit() {
         return true;
     }
+    
+    @Override
+    public boolean supportsInsertWithQueryExpression() {
+    	return false;
+    }
 
 }

Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/db2/DB2Capabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/db2/DB2Capabilities.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/db2/DB2Capabilities.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -34,12 +34,9 @@
  */
 public class DB2Capabilities extends JDBCCapabilities {
 
-    public static final int DB2_MAX_SET_SIZE = 1000;
-    
     public DB2Capabilities() {
-        this.setMaxInCriteriaSize(DB2_MAX_SET_SIZE);
-    }
-    
+    }
+    
     /**
      * @see com.metamatrix.data.ConnectorCapabilities#getSupportedFunctions()
      */

Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleCapabilities.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleCapabilities.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -33,12 +33,9 @@
  */
 public class OracleCapabilities extends JDBCCapabilities {    
     
-    public static final int ORACLE_MAX_SET_SIZE = 1000;
-    
     public OracleCapabilities() {
-        this.setMaxInCriteriaSize(ORACLE_MAX_SET_SIZE);
-    }
-    
+    }
+    
     /**
      * @see com.metamatrix.data.ConnectorCapabilities#getSupportedFunctions()
      */

Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleSQLTranslator.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleSQLTranslator.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/OracleSQLTranslator.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -45,6 +45,7 @@
 import org.teiid.connector.language.IElement;
 import org.teiid.connector.language.IGroup;
 import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
 import org.teiid.connector.language.ILimit;
 import org.teiid.connector.language.IQueryCommand;
 import org.teiid.connector.language.ISetQuery.Operation;
@@ -101,8 +102,13 @@
          * then pull the Sequence name out of the name in source of the column.
          */
     	IInsert insert = (IInsert)command;
+    	
+    	if (!(insert.getValueSource() instanceof IInsertExpressionValueSource)) {
+    		return command;
+    	}
+    	IInsertExpressionValueSource values = (IInsertExpressionValueSource)insert.getValueSource();
     	List<Element> allElements = insert.getGroup().getMetadataObject().getChildren();
-    	if (allElements.size() == insert.getValues().size()) {
+    	if (allElements.size() == values.getValues().size()) {
     		return command;
     	}
     	
@@ -134,7 +140,7 @@
             
             int delimiterIndex = sequence.indexOf(SQLReservedWords.DOT);
             if (delimiterIndex == -1) {
-            	throw new ConnectorException("Invalid name in source sequence format.  Expected <element name>" + SEQUENCE + "<sequence name>.<sequence value>, but was " + name);
+            	throw new ConnectorException("Invalid name in source sequence format.  Expected <element name>" + SEQUENCE + "<sequence name>.<sequence value>, but was " + name); //$NON-NLS-1$ //$NON-NLS-2$
             }
             String sequenceGroupName = sequence.substring(0, delimiterIndex);
             String sequenceElementName = sequence.substring(delimiterIndex + 1);
@@ -142,7 +148,7 @@
             IGroup sequenceGroup = this.getLanguageFactory().createGroup(sequenceGroupName, null, null);
             IElement sequenceElement = this.getLanguageFactory().createElement(sequenceElementName, sequenceGroup, null, element.getJavaType());
             insert.getElements().add(index, this.getLanguageFactory().createElement(element.getName(), insert.getGroup(), element, element.getJavaType()));
-            insert.getValues().add(index, sequenceElement);
+            values.getValues().add(index, sequenceElement);
 		}
         return command;
     }

Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/SequeLinkOracleCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/SequeLinkOracleCapabilities.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/oracle/SequeLinkOracleCapabilities.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -30,7 +30,7 @@
 public class SequeLinkOracleCapabilities extends OracleCapabilities {
     
 	@Override
-	public boolean supportsBulkInsert() {
+	public boolean supportsBulkUpdate() {
 		return false;
 	}
 	

Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/sqlserver/SqlServerCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/sqlserver/SqlServerCapabilities.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/sqlserver/SqlServerCapabilities.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -33,12 +33,9 @@
  */
 public class SqlServerCapabilities extends JDBCCapabilities {
 
-    public static final int SQLSRVR_MAX_SET_SIZE = 1000;
-    
     public SqlServerCapabilities() {
-        this.setMaxInCriteriaSize(SQLSRVR_MAX_SET_SIZE);
-    }
-    
+    }
+    
     /**
      * @see com.metamatrix.data.ConnectorCapabilities#getSupportedFunctions()
      */

Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/sybase/SybaseCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/sybase/SybaseCapabilities.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/sybase/SybaseCapabilities.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -34,10 +34,12 @@
  */
 public class SybaseCapabilities extends JDBCCapabilities {
 
-    public static final int SYBASE_MAX_SET_SIZE = 250;
-
     public SybaseCapabilities() {
-        this.setMaxInCriteriaSize(SYBASE_MAX_SET_SIZE);
+    }
+    
+    @Override
+    public int getMaxInCriteriaSize() {
+    	return 250;
     }
     
     /**

Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/teradata/TeradataCapabilities.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/teradata/TeradataCapabilities.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/teradata/TeradataCapabilities.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -34,10 +34,7 @@
  */
 public class TeradataCapabilities extends JDBCCapabilities {
 
-    public static final int TERADATA_MAX_SET_SIZE = 1000;
-
     public TeradataCapabilities() {
-        this.setMaxInCriteriaSize(TERADATA_MAX_SET_SIZE);
     }
     
     /* 

Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/BindValueVisitor.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/BindValueVisitor.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/BindValueVisitor.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -28,6 +28,7 @@
 import org.teiid.connector.language.IInCriteria;
 import org.teiid.connector.language.IInlineView;
 import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
 import org.teiid.connector.language.ILanguageObject;
 import org.teiid.connector.language.ILikeCriteria;
 import org.teiid.connector.language.ILiteral;
@@ -111,7 +112,7 @@
     }
 
     @Override
-    public void visit(IInsert obj) {
+    public void visit(IInsertExpressionValueSource obj) {
         replaceWithBinding = true;
         visitNodes(obj.getValues());
     }

Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/ReplacementVisitor.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/ReplacementVisitor.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/ReplacementVisitor.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -34,7 +34,7 @@
 import org.teiid.connector.language.IGroupBy;
 import org.teiid.connector.language.IInCriteria;
 import org.teiid.connector.language.IInlineView;
-import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
 import org.teiid.connector.language.IIsNullCriteria;
 import org.teiid.connector.language.ILikeCriteria;
 import org.teiid.connector.language.IQueryCommand;
@@ -106,7 +106,7 @@
         List<IExpression> expressions = obj.getElements();
         
         for (int i=0; i<expressions.size(); i++) {
-            IExpression expression = (IExpression)expressions.get(i);
+            IExpression expression = expressions.get(i);
             expressions.set(i, replaceFunction(expression));
         }
     }      
@@ -119,22 +119,20 @@
         List<IExpression> rightExprs = obj.getRightExpressions();
         
         for(int i=0; i<rightExprs.size(); i++) {
-            IExpression expr = (IExpression) rightExprs.get(i);
+            IExpression expr = rightExprs.get(i);
             rightExprs.set(i, replaceFunction(expr));
         }
     }
-
-    /**
-     * @see com.metamatrix.data.visitor.SQLStringVisitor#visit(org.teiid.connector.language.IInsert)
-     */
-    public void visit(IInsert obj) {
+    
+    @Override
+    public void visit(IInsertExpressionValueSource obj) {
         List<IExpression> values = obj.getValues();
         
         for(int i=0; i<values.size(); i++) {
-            IExpression expr = (IExpression) values.get(i);
+            IExpression expr = values.get(i);
             values.set(i, replaceFunction(expr));
         }
-    }  
+    }
     
     /* 
      * @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(com.metamatrix.data.language.IIsNullCriteria)

Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -37,9 +37,7 @@
 
 import org.teiid.connector.api.ExecutionContext;
 import org.teiid.connector.api.TypeFacility;
-import org.teiid.connector.language.IBulkInsert;
 import org.teiid.connector.language.ICommand;
-import org.teiid.connector.language.IElement;
 import org.teiid.connector.language.IFunction;
 import org.teiid.connector.language.ILanguageObject;
 import org.teiid.connector.language.ILimit;
@@ -71,7 +69,6 @@
     private boolean prepared;
     
     private List preparedValues = new ArrayList();
-    private List preparedTypes = new ArrayList();
     
     private Set<ILanguageObject> recursionObjects = Collections.newSetFromMap(new IdentityHashMap<ILanguageObject, Boolean>());
     
@@ -123,19 +120,6 @@
 		}
 	}
 
-    public void visit(IBulkInsert obj) {
-        this.prepared = true;
-
-        super.visit(obj);
-        
-        for (int i = 0; i < obj.getElements().size(); i++) {
-            IElement element = (IElement) obj.getElements().get(i);
-            this.preparedTypes.add(element.getType());
-        }
-
-        this.preparedValues = obj.getRows();
-    } 
-    
     /**
      * @param type
      * @param object
@@ -203,8 +187,7 @@
     public void visit(ILiteral obj) {
         if (this.prepared && obj.isBindValue()) {
             buffer.append(UNDEFINED_PARAM);
-            preparedValues.add(obj.getValue());
-            preparedTypes.add(obj.getType());
+            preparedValues.add(obj);
         } else {
             translateSQLType(obj.getType(), obj.getValue(), buffer);
         }
@@ -290,13 +273,6 @@
         return this.preparedValues;
     }
     
-    /** 
-     * @return the preparedValues
-     */
-    List getPreparedTypes() {
-        return this.preparedTypes;
-    }
-    
     public boolean isPrepared() {
 		return prepared;
 	}

Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/TranslatedCommand.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/TranslatedCommand.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/TranslatedCommand.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -45,7 +45,6 @@
     private String sql;
     private boolean prepared;
     private List preparedValues;
-    private List preparedTypes;
     
     private SQLConversionVisitor sqlConversionVisitor;
     private ReplacementVisitor functionVisitor;
@@ -74,7 +73,6 @@
     public void translateCommand(ICommand command) throws ConnectorException {
         this.sql = getSQL(command);
         this.preparedValues = this.sqlConversionVisitor.getPreparedValues();
-        this.preparedTypes = this.sqlConversionVisitor.getPreparedTypes();
         this.prepared = this.sqlConversionVisitor.isPrepared();
     }
 	
@@ -128,15 +126,6 @@
     }
     
     /**
-     * Return List of types to set on a prepared statement, if 
-     * necessary (see {@link #getStatementType})
-     * @return List of types to be set on a prepared statement
-     */
-    public List getPreparedTypes() {
-        return preparedTypes;
-    }
-
-    /**
      * Get String SQL of translated command; but use 
      * {@link #nextLargeSetQuerySQL} if this command is 
      * a {@link #isLargeSetQuery large set query}

Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/Translator.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/Translator.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/Translator.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -462,30 +462,6 @@
     }
     
     /**
-     * Will be called by Query and Update executions if a PreparedStatement is used.
-     * 
-     * bindValue is ultimately called from this method and for binding CallableStatement
-     * values, so subclasses should override that method if necessery to change the binding 
-     * behavior.
-     *  
-     * @see com.metamatrix.connector.jdbc.extension.ResultsTranslator#bindPreparedStatementValues(java.sql.Connection, java.sql.PreparedStatement, org.teiid.connector.jdbc.translator.TranslatedCommand)
-     */
-    public void bindPreparedStatementValues(Connection conn, PreparedStatement stmt, TranslatedCommand command) throws SQLException {
-        List params = command.getPreparedValues();
-        
-        setPreparedStatementValues(stmt, params, command.getPreparedTypes());
-    }
-
-    private void setPreparedStatementValues(PreparedStatement stmt, List paramValues, List paramTypes) throws SQLException {
-    	for (int i = 0; i< paramValues.size(); i++) {
-            Object parmvalue = paramValues.get(i);
-            Class paramType = (Class)paramTypes.get(i);
-            // this means the params is one row
-            bindValue(stmt, parmvalue, paramType, i+1);
-        }          
-    }
-
-    /**
      * Sets prepared statement parameter i with param.
      * 
      * Performs special handling to translate dates using the database time zone and to
@@ -498,7 +474,7 @@
      * @param cal
      * @throws SQLException
      */
-    protected void bindValue(PreparedStatement stmt, Object param, Class paramType, int i) throws SQLException {
+    public void bindValue(PreparedStatement stmt, Object param, Class paramType, int i) throws SQLException {
         int type = TypeFacility.getSQLTypeFromRuntimeType(paramType);
                 
         if (param == null) {
@@ -529,34 +505,6 @@
         stmt.setObject(i, param, type);
     }
     
-    /**
-     * Execute a bulk insert on the given preparedstatement.
-     * @param conn
-     * @param stmt
-     * @param command
-     * @return
-     * @throws SQLException
-     */
-    public int executeStatementForBulkInsert(Connection conn, PreparedStatement stmt, TranslatedCommand command) throws SQLException {
-        List rows = command.getPreparedValues();
-        int updateCount = 0;
-        
-        for (int i = 0; i< rows.size(); i++) {
-            List row = (List) rows.get(i);
-             
-            setPreparedStatementValues(stmt, row, command.getPreparedTypes());
-            
-            stmt.addBatch();
-        }
-        
-        int[] results = stmt.executeBatch();
-        
-        for (int i=0; i<results.length; i++) {
-            updateCount += results[i];
-        }        
-        return updateCount;
-    } 
-
 	/**
 	 * Retrieve the value on the current resultset row for the given column index.
 	 * @param results
@@ -818,16 +766,6 @@
 				result = getDefaultCapabilities().newInstance();
 			}
 
-			if (result instanceof JDBCCapabilities) {
-				String setCriteriaBatchSize = this.environment.getProperties().getProperty(JDBCPropertyNames.SET_CRITERIA_BATCH_SIZE);
-				if (setCriteriaBatchSize != null) {
-					int maxInCriteriaSize = Integer
-							.parseInt(setCriteriaBatchSize);
-					if (maxInCriteriaSize > 0) {
-						((JDBCCapabilities) result).setMaxInCriteriaSize(maxInCriteriaSize);
-					}
-				}
-			}
 			return result;
 		} catch (Exception e) {
 			throw new ConnectorException(e);

Deleted: trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCConnector.java
===================================================================
--- trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCConnector.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-jdbc/src/test/java/org/teiid/connector/jdbc/TestJDBCConnector.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -1,63 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.connector.jdbc;
-
-import java.util.Properties;
-
-import static org.junit.Assert.*;
-import org.junit.Test;
-import org.teiid.connector.api.ConnectorCapabilities;
-import org.teiid.connector.api.ConnectorException;
-import org.teiid.connector.jdbc.translator.Translator;
-
-import com.metamatrix.cdk.api.EnvironmentUtility;
-
-
-public class TestJDBCConnector {
-
-    public void helpTestMaxIn(int setting, int expected) throws Exception {
-        Properties connProps = new Properties();
-        connProps.setProperty(JDBCPropertyNames.SET_CRITERIA_BATCH_SIZE, String.valueOf(setting)); 
-        connProps.setProperty(JDBCPropertyNames.EXT_CAPABILITY_CLASS, SimpleCapabilities.class.getName());
-        Translator t = new Translator();
-        t.initialize(EnvironmentUtility.createEnvironment(connProps));
-        ConnectorCapabilities caps = t.getConnectorCapabilities();
-        int maxIn = caps.getMaxInCriteriaSize();
-        assertEquals(expected, maxIn);
-    }
-
-    @Test
-    public void test1() throws Exception {
-        helpTestMaxIn(-1, 250);
-    }
-
-    @Test
-    public void test2() throws Exception {
-        helpTestMaxIn(0, 250);
-    }
-
-    @Test
-    public void test3() throws Exception {
-        helpTestMaxIn(1, 1);
-    }	
-}

Modified: trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnector.java
===================================================================
--- trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnector.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnector.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -73,24 +73,8 @@
 		}
 		this.props = env.getProperties();
 		
-		// Get properties for initial connection.
-		// LDAP Max In Criteria
-		String ldapMaxCriteriaStr = props.getProperty(LDAPConnectorPropertyNames.LDAP_MAX_CRITERIA);
-		if(ldapMaxCriteriaStr!=null) {
-			try {
-				ldapMaxCriteria = Integer.parseInt(ldapMaxCriteriaStr);
-			} catch (NumberFormatException ex) {
-	            final String msg = LDAPPlugin.Util.getString("LDAPConnection.maxCriteriaParseError"); //$NON-NLS-1$
-	            throw new ConnectorException(msg);
-			}
-		} else {
-            final String msg = LDAPPlugin.Util.getString("LDAPConnection.maxCriteriaPropNotFound"); //$NON-NLS-1$
-            throw new ConnectorException(msg);
-		}
-		
 		// Create and configure capabilities class.
 		myCaps = new LDAPConnectorCapabilities();
-		myCaps.setInCriteriaSize(ldapMaxCriteria);
 	}
 
 	/** 

Modified: trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnectorCapabilities.java
===================================================================
--- trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnectorCapabilities.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnectorCapabilities.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -29,8 +29,9 @@
  */
 public class LDAPConnectorCapabilities extends BasicConnectorCapabilities {
 	
-	public void setInCriteriaSize(int maxInCriteriaSize) {
-		this.maxInCriteriaSize = maxInCriteriaSize;
+	@Override
+	public int getMaxInCriteriaSize() {
+		return 1000;
 	}
 	
     public boolean supportsCompareCriteriaEquals() {

Modified: trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnectorPropertyNames.java
===================================================================
--- trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnectorPropertyNames.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPConnectorPropertyNames.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -29,7 +29,6 @@
     public static final String LDAP_ADMIN_USER_DN = "LdapAdminUserDN"; //$NON-NLS-1$
     public static final String LDAP_ADMIN_USER_PASSWORD = "LdapAdminUserPassword"; //$NON-NLS-1$
     public static final String LDAP_TXN_TIMEOUT_IN_MILLIS = "LdapTxnTimeoutInMillis"; //$NON-NLS-1$
-    public static final String LDAP_MAX_CRITERIA = "LdapMaxCriteria"; //$NON-NLS-1$
     public static final String LDAP_DEFAULT_BASEDN = "SearchDefaultBaseDN"; //$NON-NLS-1$
     public static final String LDAP_DEFAULT_SCOPE = "SearchDefaultScope"; //$NON-NLS-1$
     public static final String LDAP_RESTRICT_TO_OBJECTCLASS = "RestrictToObjectClass"; //$NON-NLS-1$

Modified: trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPUpdateExecution.java
===================================================================
--- trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPUpdateExecution.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-ldap/src/main/java/com/metamatrix/connector/ldap/LDAPUpdateExecution.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -46,6 +46,7 @@
 import org.teiid.connector.language.IElement;
 import org.teiid.connector.language.IExpression;
 import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
 import org.teiid.connector.language.ILiteral;
 import org.teiid.connector.language.ISetClause;
 import org.teiid.connector.language.IUpdate;
@@ -164,7 +165,7 @@
 			throws ConnectorException {
 
 		List insertElementList = ((IInsert)command).getElements();
-		List insertValueList = ((IInsert)command).getValues();
+		List insertValueList = ((IInsertExpressionValueSource)((IInsert)command).getValueSource()).getValues();
 		// create a new attribute list with case ignored in attribute
 		// names
 		Attributes insertAttrs = new BasicAttributes(true);

Modified: trunk/connectors/connector-ldap/src/main/resources/connector-ldap.xml
===================================================================
--- trunk/connectors/connector-ldap/src/main/resources/connector-ldap.xml	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-ldap/src/main/resources/connector-ldap.xml	2009-05-11 14:34:31 UTC (rev 903)
@@ -2,11 +2,9 @@
             <PropertyDefinition Name="ConnectorClassPath" DisplayName="Class Path" ShortDescription="" Multiplicity="0..1" IsPreferred="true"/>        
             <PropertyDefinition Name="ConnectorTypeClassPath" DisplayName="Connector Type Class Path" ShortDescription="Connector Type classpath (defined by system, do not modify)" DefaultValue="extensionjar:connector_patch.jar;extensionjar:${project.artifactId}-${project.version}.jar;${classpath}" Multiplicity="0..1" IsExpert="true"/>
             <PropertyDefinition Name="SearchDefaultBaseDN" DisplayName="Default Search Base DN" ShortDescription="Default Base DN for LDAP Searches" IsExpert="true" />
-            <PropertyDefinition Name="com.metamatrix.data.pool.cleaning_interval" DisplayName="Pool cleaning Interval (seconds)" ShortDescription="Set the interval to cleaning the pool" DefaultValue="300" PropertyType="Integer" IsExpert="true" />
             <PropertyDefinition Name="LdapAdminUserDN" DisplayName="Ldap Admin User DN" ShortDescription="User DN for the LDAP admin account." DefaultValue="cn=&lt;&gt;,ou=&lt;&gt;,dc=&lt;&gt;" Multiplicity="1" IsPreferred="true" />
             <PropertyDefinition Name="Standard" DisplayName="Standard Type" ShortDescription="Standard Built-in Connector Type" DefaultValue="true" PropertyType="Boolean" IsExpert="true" IsModifiable="false" />
             <PropertyDefinition Name="ConnectorClass" DisplayName="Connector Class" ShortDescription="" DefaultValue="com.metamatrix.connector.ldap.LDAPConnector" Multiplicity="1" IsExpert="true" />
-            <PropertyDefinition Name="LdapMaxCriteria" DisplayName="Ldap Max Criteria" ShortDescription="Maximum number of criteria supported in an LDAP search filter." DefaultValue="1000" Multiplicity="1" />
             <PropertyDefinition Name="LdapAdminUserPassword" DisplayName="Ldap Admin Password" ShortDescription="Password of the LDAP admin user account." Multiplicity="1" IsMasked="true" IsPreferred="true" />
             <PropertyDefinition Name="SearchDefaultScope" DisplayName="Default Search Scope" ShortDescription="Default Scope for LDAP Searches" DefaultValue="SUBTREE_SCOPE" Multiplicity="1">
                 <AllowedValue>OBJECT_SCOPE</AllowedValue>
@@ -14,10 +12,6 @@
                 <AllowedValue>SUBTREE_SCOPE</AllowedValue>
             </PropertyDefinition>
             <PropertyDefinition Name="RestrictToObjectClass" DisplayName="Restrict Searches To Named Object Class" ShortDescription="Restrict Searches to objectClass named in the Name field for a table" DefaultValue="false" PropertyType="Boolean" IsExpert="true" />
-            <PropertyDefinition Name="com.metamatrix.data.pool.max_connections" DisplayName="Pool Maximum Connections" ShortDescription="Set the maximum number of connections for the connection pool" DefaultValue="100" Multiplicity="1" PropertyType="Integer" IsExpert="true" />
             <PropertyDefinition Name="LdapTxnTimeoutInMillis" DisplayName="Ldap Transaction Timeout (ms)" ShortDescription="Timeout value for LDAP searches. Defaults to TCP timeout value." />
-            <PropertyDefinition Name="com.metamatrix.data.pool.wait_for_source_time" DisplayName="Pool Connection Waiting Time (milliseconds)" ShortDescription="Set the time to wait if the connection is not available" DefaultValue="60000" PropertyType="Integer" IsExpert="true" />
             <PropertyDefinition Name="LdapUrl" DisplayName="Ldap URL" ShortDescription="Ldap URL of the server, including port number." DefaultValue="ldap://&lt;ldapServer&gt;:&lt;389&gt;" Multiplicity="1" IsPreferred="true" />
-            <PropertyDefinition Name="com.metamatrix.data.pool.live_and_unused_time" DisplayName="Pool Connection Idle Time (seconds)" ShortDescription="Set the idle time of the connection before it should be closed if pool shrinking is enabled" DefaultValue="300" PropertyType="Integer" IsExpert="true" />
-            <PropertyDefinition Name="com.metamatrix.data.pool.enable_shrinking" DisplayName="Pool Shrinking Enabled" ShortDescription="Set whether to enable the pool shrinking" DefaultValue="true" PropertyType="Boolean" IsExpert="true" />
         </ComponentType>
\ No newline at end of file

Modified: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Connector.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Connector.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Connector.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -119,15 +119,6 @@
 		} catch (Exception e) {
 			throw new ConnectorException(e, "Unable to load Capabilities Class");
 		}
-		try {
-			String inLimitString = env.getProperties().getProperty("InLimit", Integer.toString(-1));
-			int inLimit = inLimitString == null ? -1 : Integer.decode(inLimitString).intValue();
-			salesforceCapabilites.setMaxInCriteriaSize(inLimit);
-		} catch (NumberFormatException e) {
-			throw new ConnectorException(Messages.getString("SalesforceConnection.bad.IN.value"));
-		}
-
-		
 		logger.logTrace("Return SalesforceSourceConnection.initialize()");
 	}
 

Modified: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesforceCapabilities.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesforceCapabilities.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/SalesforceCapabilities.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -30,13 +30,9 @@
 public class SalesforceCapabilities extends BasicConnectorCapabilities {
 	
     public int getMaxInCriteriaSize() {
-    	return maxInCriteriaSize;
+    	return 100;
     }
     
-    public void setMaxInCriteriaSize(int size) {
-    	maxInCriteriaSize = size;
-    }
-    
     public List getSupportedFunctions() {
         List<String> supportedFunctions = new ArrayList<String>();
         supportedFunctions.add("includes");

Modified: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/visitors/InsertVisitor.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/visitors/InsertVisitor.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/visitors/InsertVisitor.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -31,6 +31,7 @@
 import org.teiid.connector.language.IElement;
 import org.teiid.connector.language.IExpression;
 import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
 import org.teiid.connector.language.ILiteral;
 import org.teiid.connector.metadata.runtime.Element;
 import org.teiid.connector.metadata.runtime.RuntimeMetadata;
@@ -51,7 +52,7 @@
 			loadColumnMetadata(insert.getGroup());
 			
 			List<IElement> columns = insert.getElements();
-			List<IExpression> values = insert.getValues();
+			List<IExpression> values = ((IInsertExpressionValueSource)insert.getValueSource()).getValues();
 			if(columns.size() != values.size()) {
 				throw new ConnectorException("Error:  columns.size and values.size are not the same.");
 			}

Modified: trunk/connectors/connector-salesforce/src/main/resources/connector-salesforce.xml
===================================================================
--- trunk/connectors/connector-salesforce/src/main/resources/connector-salesforce.xml	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/connectors/connector-salesforce/src/main/resources/connector-salesforce.xml	2009-05-11 14:34:31 UTC (rev 903)
@@ -4,9 +4,7 @@
             <PropertyDefinition Name="username" DisplayName="User Name" ShortDescription="Name value for Salesforce authentication" DefaultValue="" Multiplicity="1" IsPreferred="true" />
             <PropertyDefinition Name="ConnectorStateClass" DisplayName="Connector State Class" ShortDescription="" DefaultValue="com.metamatrix.connector.salesforce.ConnectorState" Multiplicity="1" IsExpert="true" />
             <PropertyDefinition Name="ConnectorClass" DisplayName="Connector Class" ShortDescription="" DefaultValue="com.metamatrix.connector.salesforce.Connector" Multiplicity="1" IsExpert="true" />
-            <PropertyDefinition Name="InLimit" DisplayName="IN Criteria Limit" ShortDescription="The maximum number of values that can be supplied in an IN criteria" DefaultValue="-1" Multiplicity="1" IsExpert="true" />
             <PropertyDefinition Name="password" DisplayName="Password" ShortDescription="Password value for Salesforce authentication" DefaultValue="" Multiplicity="1" IsMasked="true" IsPreferred="true" />
             <PropertyDefinition Name="URL" DisplayName="Salesforce URL" ShortDescription="URL for connecting to Salesforce" DefaultValue="" IsExpert="true" />
             <PropertyDefinition Name="ConnectorCapabilities" DisplayName="Connector Capabilities Class" ShortDescription="The class to use to provide the Connector Capabilities" DefaultValue="com.metamatrix.connector.salesforce.SalesforceCapabilities" IsConstrainedToAllowedValues="false" IsExpert="true" />
-			<PropertyDefinition Name="SetCriteriaBatchSize" DisplayName="SetCriteria Batch Size" ShortDescription="Max number of values in a SetCriteria before batching into multiple queries.  A value &lt;= 0 indicates batching is OFF." DefaultValue="0" Multiplicity="0..1" PropertyType="Integer" ValueDelimiter="," IsConstrainedToAllowedValues="false" IsExpert="true" IsHidden="false" IsMasked="false" IsModifiable="true" IsPreferred="false" />
         </ComponentType>
\ No newline at end of file

Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/capabilities/SourceCapabilities.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/capabilities/SourceCapabilities.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/capabilities/SourceCapabilities.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -277,13 +277,8 @@
          * @since 4.2
          */
         BATCHED_UPDATES,
+        BULK_UPDATE,
         /**
-         * Support indicates connector can accept queries with searched CASE WHEN <criteria> ... END
-         * 
-         * @since 4.2
-         */
-        BULK_INSERT,
-        /**
          * Support indicates connector can limit result rows
          * 
          * @since 5.0 SP1
@@ -308,10 +303,6 @@
          * @since 5.0.2
          */
         CONNECTOR_ID,
-        /** Support indicates connector support prepared statement batch update
-         * @since 5.5.2
-         */
-        PREPARED_BATCH_UPDATE,
         /**
          * @since 6.0.0 indicates the source supports XA transactions
          */
@@ -320,6 +311,7 @@
          * @since 6.0.0 indicates support for where all
          */
         REQUIRES_CRITERIA,
+        INSERT_WITH_QUERYEXPRESSION
     }
 
     public enum Scope {

Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/PlanToProcessConverter.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/PlanToProcessConverter.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/PlanToProcessConverter.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -171,7 +171,7 @@
                         if (!metadata.isVirtualGroup(groupID) && !metadata.isTemporaryTable(groupID)) {
                             SourceCapabilities caps = capFinder.findCapabilities(modelName);
                             pinode.setDoBatching(caps.supportsCapability(Capability.BATCHED_UPDATES));
-                            pinode.setDoBulkInsert(caps.supportsCapability(Capability.BULK_INSERT));
+                            pinode.setDoBulkInsert(caps.supportsCapability(Capability.BULK_UPDATE));
                         } else if (metadata.isTemporaryTable(groupID)) {
                             pinode.setDoBulkInsert(true);
                         }

Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleCollapseSource.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleCollapseSource.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleCollapseSource.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -41,6 +41,7 @@
 import com.metamatrix.query.processor.ProcessorPlan;
 import com.metamatrix.query.processor.relational.AccessNode;
 import com.metamatrix.query.processor.relational.RelationalPlan;
+import com.metamatrix.query.resolver.util.ResolverUtil;
 import com.metamatrix.query.rewriter.QueryRewriter;
 import com.metamatrix.query.sql.lang.Command;
 import com.metamatrix.query.sql.lang.CompoundCriteria;
@@ -48,6 +49,7 @@
 import com.metamatrix.query.sql.lang.From;
 import com.metamatrix.query.sql.lang.FromClause;
 import com.metamatrix.query.sql.lang.GroupBy;
+import com.metamatrix.query.sql.lang.Insert;
 import com.metamatrix.query.sql.lang.JoinPredicate;
 import com.metamatrix.query.sql.lang.JoinType;
 import com.metamatrix.query.sql.lang.Limit;
@@ -87,8 +89,19 @@
         		Command command = FrameUtil.getNonQueryCommand(accessNode);
         		
                 if(command == null) {
-                    plan = removeUnnecessaryInlineView(plan, accessNode);
-                    command = createQuery(metadata, capFinder, accessNode, accessNode);
+                	PlanNode commandRoot = accessNode;
+                	GroupSymbol intoGroup = (GroupSymbol)accessNode.getFirstChild().getProperty(NodeConstants.Info.INTO_GROUP);
+                	if (intoGroup != null) {
+                		commandRoot = NodeEditor.findNodePreOrder(accessNode, NodeConstants.Types.SOURCE).getFirstChild();
+                	}
+                    plan = removeUnnecessaryInlineView(plan, commandRoot);
+                    QueryCommand queryCommand = createQuery(metadata, capFinder, accessNode, commandRoot);
+                    command = queryCommand;
+                    if (intoGroup != null) {
+                    	Insert insertCommand = new Insert(intoGroup, ResolverUtil.resolveElementsInGroup(intoGroup, metadata), null);
+                    	insertCommand.setQueryExpression(queryCommand);
+                    	command = insertCommand;
+                    }
                 } 
         		accessNode.setProperty(NodeConstants.Info.ATOMIC_REQUEST, command);
             }

Modified: trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRaiseAccess.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRaiseAccess.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/optimizer/relational/rules/RuleRaiseAccess.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -179,8 +179,17 @@
                     return null;
                 }
                 
-                if (!CapabilitiesUtil.supportsInlineView(modelID, metadata, capFinder)) {
+                //raise only if there is no intervening project into
+                PlanNode parentProject = NodeEditor.findParent(parentNode, NodeConstants.Types.PROJECT);
+                GroupSymbol intoGroup = (GroupSymbol)parentProject.getProperty(NodeConstants.Info.INTO_GROUP); 
+                if (intoGroup != null && parentProject.getParent() == null) {
+                	if (CapabilitiesUtil.supports(Capability.INSERT_WITH_QUERYEXPRESSION, modelID, metadata, capFinder) && CapabilitiesUtil.isSameConnector(modelID, metadata.getModelID(intoGroup.getMetadataID()), metadata, capFinder)) {
+                    	rootNode = performRaise(rootNode, accessNode, parentNode);
+                    	return performRaise(rootNode, accessNode, parentProject);
+                	}
                 	return null;
+                } else if (!CapabilitiesUtil.supportsInlineView(modelID, metadata, capFinder)) {
+                	return null;
                 }
 
                 //is there another query that will be used with this source
@@ -188,12 +197,6 @@
                 	return null;
                 }
                                 
-                //raise only if there is no intervening project into
-                PlanNode parentProject = NodeEditor.findParent(parentNode, NodeConstants.Types.PROJECT);
-                if (parentProject.getProperty(NodeConstants.Info.INTO_GROUP) != null) {
-                    return null;
-                }
-                
                 //switch to inline view and change the group on the access to that of the source
             	parentNode.setProperty(NodeConstants.Info.INLINE_VIEW, Boolean.TRUE);
             	accessNode.getGroups().clear();

Modified: trunk/engine/src/main/java/com/metamatrix/query/processor/relational/ProjectIntoNode.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/processor/relational/ProjectIntoNode.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/processor/relational/ProjectIntoNode.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -35,12 +35,12 @@
 import com.metamatrix.common.buffer.TupleBatch;
 import com.metamatrix.common.buffer.TupleSource;
 import com.metamatrix.query.sql.lang.BatchedUpdateCommand;
-import com.metamatrix.query.sql.lang.BulkInsert;
 import com.metamatrix.query.sql.lang.Command;
 import com.metamatrix.query.sql.lang.Insert;
 import com.metamatrix.query.sql.symbol.Constant;
 import com.metamatrix.query.sql.symbol.ElementSymbol;
 import com.metamatrix.query.sql.symbol.GroupSymbol;
+import com.metamatrix.query.sql.symbol.Reference;
 
 public class ProjectIntoNode extends RelationalNode {
 
@@ -115,7 +115,7 @@
                 currentBatch = getChildren()[0].nextBatch(); // can throw BlockedException
                 this.batchRow = currentBatch.getBeginRow();
                 
-                if(currentBatch.getRowCount() == 0 && !this.intoGroup.isImplicitTempGroupSymbol()) {
+                if(currentBatch.getRowCount() == 0) {
                     continue;
                 }
             } else if (currentBatch.getTerminationFlag() && this.batchRow > currentBatch.getEndRow()) {
@@ -126,15 +126,22 @@
             int batchSize = currentBatch.getRowCount();
             
             if (doBulkInsert) {
+            	//convert to multivalued parameter
+                List<Constant> parameters = new ArrayList<Constant>(intoElements.size());
+                for (int i = 0; i < intoElements.size(); i++) {
+					Constant value = new Constant(null, ((ElementSymbol)intoElements.get(i)).getType());
+					value.setMultiValued(new ArrayList<Object>(currentBatch.getAllTuples().length));
+                	parameters.add(value);
+				}
+                for (List row : currentBatch.getAllTuples()) {
+                	for (int i = 0; i < row.size(); i++) {
+                		((List<Object>)parameters.get(i).getValue()).add(row.get(i));
+                	}
+				}
                 // Create a bulk insert command batching all rows in the current batch.
-                BulkInsert insert = new BulkInsert(intoGroup, intoElements);
-                
-                List rows = Arrays.asList(currentBatch.getAllTuples());
-                insert.setRows(rows);
-                
+                Insert insert = new Insert(intoGroup, intoElements, parameters);
                 // Register insert command against source 
                 registerRequest(insert);
-                
             } else if (doBatching) { 
                 // Register batched update command against source
                 int endRow = currentBatch.getEndRow();

Modified: trunk/engine/src/main/java/com/metamatrix/query/sql/LanguageVisitor.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/sql/LanguageVisitor.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/sql/LanguageVisitor.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -60,7 +60,6 @@
     public void visit(Insert obj) {
         visit((ProcedureContainer)obj);
     }
-    public void visit(BulkInsert obj) {}
     public void visit(IsNullCriteria obj) {}
     public void visit(JoinPredicate obj) {}
     public void visit(JoinType obj) {}

Deleted: trunk/engine/src/main/java/com/metamatrix/query/sql/lang/BulkInsert.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/sql/lang/BulkInsert.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/sql/lang/BulkInsert.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -1,162 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package com.metamatrix.query.sql.lang;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import com.metamatrix.api.exception.MetaMatrixComponentException;
-import com.metamatrix.core.util.EquivalenceUtil;
-import com.metamatrix.query.metadata.QueryMetadataInterface;
-import com.metamatrix.query.sql.LanguageVisitor;
-import com.metamatrix.query.sql.symbol.ElementSymbol;
-import com.metamatrix.query.sql.symbol.Expression;
-import com.metamatrix.query.sql.symbol.GroupSymbol;
-
-/**
- * Bulk insert is variation of Insert command, where a single table is being 
- * inserted with multiple values. The purpose of this class from Insert is to
- * minimize the memory footprint and avoid multiple planning and performace.
- */
-public class BulkInsert extends Insert {
-    private List rowValues = null;
-
-    /**
-     * Default ctor
-     * @param group - Group Name
-     * @param variables - Column Names
-     */    
-    public BulkInsert(GroupSymbol group, List variables, List rows){
-        super(group,variables, null);
-        this.rowValues = rows;
-    }
-
-    /**
-     * Default ctor
-     * @param group - Group Name
-     * @param variables - Column Names
-     */
-    public BulkInsert(GroupSymbol group, List variables){
-        super(group,variables, null);
-    }
-    
-    /**
-     * Get the list of rows of column values.  
-     * @return List(row)-->list of column values; never null
-     */
-    public List getRows() {
-        if (rowValues == null) {
-            return Collections.EMPTY_LIST;    
-        }
-        return rowValues;
-        
-    }
-
-    /**
-     * Get the list of rows of column values.  
-     * (row)-->list of column values
-     */
-    public void setRows(List rows) {
-        rowValues = rows;
-    }
-    
-    /**
-     * @see com.metamatrix.query.sql.lang.Insert#addValue(com.metamatrix.query.sql.symbol.Expression)
-     */
-    public void addValue(Expression value) {
-        throw new UnsupportedOperationException("This operation not allowed in BulkInsert"); //$NON-NLS-1$
-    }
-    /**
-     * @see com.metamatrix.query.sql.lang.Insert#getValues()
-     */
-    public List getValues() {
-        throw new UnsupportedOperationException("This operation not allowed in BulkInsert"); //$NON-NLS-1$    
-    }
-    /**
-     * @see com.metamatrix.query.sql.lang.Insert#setValues(java.util.List)
-     */
-    public void setValues(List values) {
-        throw new UnsupportedOperationException("This operation not allowed in BulkInsert"); //$NON-NLS-1$
-    }
-    
-    /**
-     * @see java.lang.Object#clone()
-     */
-    public Object clone() {
-	    GroupSymbol group = getGroup();
-	    GroupSymbol copyGroup = null;
-	    if(group != null) { 
-	    	copyGroup = (GroupSymbol) group.clone();    
-	    }
-	    
-	    List copyVars = null;
-	    if(getVariables() != null) { 
-	    	copyVars = new ArrayList(getVariables().size());
-	    	Iterator iter = getVariables().iterator();
-	    	while(iter.hasNext()) { 
-	    		ElementSymbol element = (ElementSymbol) iter.next();
-	    		copyVars.add( element.clone() );    
-	    	}    
-	    }
-	    	    
-	    // now make a new copy of the original
-	    BulkInsert copy = new BulkInsert(copyGroup, copyVars);
-	    copy.rowValues = getRows();	    
-        copyMetadataState(copy);
-		return copy;        
-    }
-
-    /**
-     * @see java.lang.Object#equals(java.lang.Object)
-     */
-    public boolean equals(Object obj) {
-    	// Quick same object test
-    	if(this == obj) {
-    		return true;
-		}
-
-		// Quick fail tests
-    	if(!(obj instanceof BulkInsert)) {
-    		return false;
-		}
-
-    	BulkInsert other = (BulkInsert) obj;
-        
-        return EquivalenceUtil.areEqual(getGroup(), other.getGroup()) &&               
-               EquivalenceUtil.areEqual(getVariables(), other.getVariables()) &&
-               EquivalenceUtil.areEqual(getRows(), other.getRows());        
-    }
-    
-    public void acceptVisitor(LanguageVisitor visitor) {
-        visitor.visit(this);
-    }   
-    
-    /** 
-     * @see com.metamatrix.query.sql.lang.PreparedBatchUpdate#updatingModelCount(com.metamatrix.query.metadata.QueryMetadataInterface)
-     */
-    public int updatingModelCount(QueryMetadataInterface metadata) throws MetaMatrixComponentException {
-        return 2; // return 2 since we may be multibatch
-    }
-}

Modified: trunk/engine/src/main/java/com/metamatrix/query/sql/lang/Insert.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/sql/lang/Insert.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/sql/lang/Insert.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -33,6 +33,7 @@
 import com.metamatrix.core.util.HashCodeUtil;
 import com.metamatrix.query.sql.LanguageVisitor;
 import com.metamatrix.query.sql.ProcedureReservedWords;
+import com.metamatrix.query.sql.symbol.Constant;
 import com.metamatrix.query.sql.symbol.ElementSymbol;
 import com.metamatrix.query.sql.symbol.Expression;
 import com.metamatrix.query.sql.symbol.GroupSymbol;
@@ -104,6 +105,16 @@
     public void setGroup(GroupSymbol group) {
         this.group = group;
     }
+    
+    public boolean isBulk() {
+    	if (this.values == null) {
+    		return false;
+    	}
+    	if (!(this.values.get(0) instanceof Constant)) {
+    		return false;
+    	}
+    	return ((Constant)this.values.get(0)).isMultiValued();
+    }
 
     /**
      * Return an ordered List of variables, may be null if no columns were specified
@@ -260,6 +271,9 @@
         }
         
 	    Insert copy = new Insert(copyGroup, copyVars, copyVals);
+	    if (this.queryExpression != null) {
+	    	copy.setQueryExpression((QueryCommand)this.queryExpression.clone());
+	    }
         this.copyMetadataState(copy);
 		return copy;
 	}

Modified: trunk/engine/src/main/java/com/metamatrix/query/sql/navigator/PreOrPostOrderNavigator.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/sql/navigator/PreOrPostOrderNavigator.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/sql/navigator/PreOrPostOrderNavigator.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -29,7 +29,6 @@
 import com.metamatrix.query.sql.LanguageVisitor;
 import com.metamatrix.query.sql.lang.BatchedUpdateCommand;
 import com.metamatrix.query.sql.lang.BetweenCriteria;
-import com.metamatrix.query.sql.lang.BulkInsert;
 import com.metamatrix.query.sql.lang.CompareCriteria;
 import com.metamatrix.query.sql.lang.CompoundCriteria;
 import com.metamatrix.query.sql.lang.Create;
@@ -300,15 +299,6 @@
         visitNode(obj.getTable());
         postVisitVisitor(obj);
     }
-    public void visit(BulkInsert obj) {
-        preVisitVisitor(obj);
-        visitNode(obj.getGroup());
-        visitNodes(obj.getVariables());
-        // No values neeed to be traversed for this.
-        // visitNodes(obj.getValues());
-        visitNode(obj.getOption());
-        postVisitVisitor(obj);
-    }    
     public void visit(Into obj) {
         preVisitVisitor(obj);
         visitNode(obj.getGroup());

Modified: trunk/engine/src/main/java/com/metamatrix/query/sql/symbol/Constant.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/sql/symbol/Constant.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/sql/symbol/Constant.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -22,6 +22,8 @@
 
 package com.metamatrix.query.sql.symbol;
 
+import java.util.List;
+
 import com.metamatrix.common.types.DataTypeManager;
 import com.metamatrix.query.QueryPlugin;
 import com.metamatrix.query.sql.LanguageVisitor;
@@ -34,10 +36,11 @@
  * value, but that is not true if the value is null.  In that case, the type is unknown
  * and is set to the null type until the type is resolved at a later point.
  */
-public class Constant implements Expression, Comparable {
+public class Constant implements Expression {
 
 	private Object value;
 	private Class type;
+	private boolean multiValued;
 
 	/**
 	 * Construct a typed constant.  The specified value is not verified to be a value
@@ -103,11 +106,20 @@
 	public boolean isResolved() {
 		return true;
 	}
+	
+    public void setMultiValued(List<?> value) {
+		this.multiValued = true;
+		this.value = value;
+	}
+    
+    public boolean isMultiValued() {
+		return multiValued;
+	}
 
     public void acceptVisitor(LanguageVisitor visitor) {
         visitor.visit(this);
     }
-
+    
 	/**
 	 * Compare this constant to another constant for equality.
 	 * @param obj Other object
@@ -155,7 +167,9 @@
 	 * @return Shallow copy of object
 	 */
 	public Object clone() {
-        return new Constant(getValue(), getType());
+        Constant copy =  new Constant(getValue(), getType());
+        copy.multiValued = multiValued;
+        return copy;
 	}
 
 	/**
@@ -165,26 +179,5 @@
 	public String toString() {
 		return SQLStringVisitor.getSQLString(this);
 	}
-
-    /** 
-     * @see java.lang.Comparable#compareTo(java.lang.Object)
-     * @since 4.2
-     */
-    public int compareTo(Object o) throws ClassCastException {
-        if(o instanceof Constant) {
-            Constant compare = (Constant)o;
-            if(this.type.equals(compare.type)) {
-                if(compare.value == null) {
-                    return 1;
-                } else if(this.value == null) {
-                    return -1;
-                } else if(compare.value instanceof Comparable) {
-                    return ((Comparable)this.value).compareTo(compare.value);
-                }
-            }
-        }
-        throw new ClassCastException();
-    }
-    
-
+	
 }

Modified: trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/EvaluatableVisitor.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/EvaluatableVisitor.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/EvaluatableVisitor.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -39,6 +39,7 @@
 import com.metamatrix.query.sql.lang.SubquerySetCriteria;
 import com.metamatrix.query.sql.navigator.PreOrderNavigator;
 import com.metamatrix.query.sql.symbol.AggregateSymbol;
+import com.metamatrix.query.sql.symbol.Constant;
 import com.metamatrix.query.sql.symbol.ElementSymbol;
 import com.metamatrix.query.sql.symbol.ExpressionSymbol;
 import com.metamatrix.query.sql.symbol.Function;
@@ -73,6 +74,13 @@
         }
     }
     
+    @Override
+    public void visit(Constant obj) {
+    	if (obj.isMultiValued()) {
+            evaluationNotPossible(EvaluationLevel.PUSH_DOWN);
+    	}
+    }
+    
     private void setDeterminismLevel(int value) {
     	determinismLevel = Math.max(determinismLevel, value);
     }

Modified: trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/EvaluateExpressionVisitor.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/EvaluateExpressionVisitor.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/EvaluateExpressionVisitor.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -83,12 +83,12 @@
         try {
             value = new Evaluator(Collections.emptyMap(), dataMgr, context).evaluate(expr, Collections.emptyList());
         } catch (MetaMatrixException err) {
-        	if (expr instanceof Reference) {
-        		return expr;
-        	}
             throw new MetaMatrixRuntimeException(err);
         }
-		return new Constant(value, expr.getType());			 
+        if (value instanceof Constant) {
+        	return (Constant)value; //multi valued substitution
+        }
+		return new Constant(value, expr.getType());
     }
     
     /**

Modified: trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/SQLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/SQLStringVisitor.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/sql/visitor/SQLStringVisitor.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -36,7 +36,6 @@
 import com.metamatrix.query.sql.LanguageVisitor;
 import com.metamatrix.query.sql.ReservedWords;
 import com.metamatrix.query.sql.lang.BetweenCriteria;
-import com.metamatrix.query.sql.lang.BulkInsert;
 import com.metamatrix.query.sql.lang.CompareCriteria;
 import com.metamatrix.query.sql.lang.CompoundCriteria;
 import com.metamatrix.query.sql.lang.Create;
@@ -468,26 +467,6 @@
         }
     }
 
-    public void visit(BulkInsert obj) {
-        formatBasicInsert(obj);
-        int varCount = obj.getVariables().size();
-        parts.add(ReservedWords.VALUES);
-        parts.add(" ("); //$NON-NLS-1$
-        for (int i=0; i<varCount; i++) {
-            parts.add("?"); //$NON-NLS-1$
-            if (i < varCount-1) {
-                parts.add(","); //$NON-NLS-1$
-            }
-        }        
-        parts.add(")"); //$NON-NLS-1$
-
-    	// Option clause
-		if(obj.getOption() != null) {
-            parts.add(SPACE);
-            parts.add(registerNode(obj.getOption()));
-		}
-    }
-    
     public void visit(IsNullCriteria obj) {
         Expression expr = obj.getExpression();
         Object exprPart = registerNode(expr);
@@ -1153,8 +1132,9 @@
 
     public void visit(Constant obj) {
         Object[] constantParts = null;
-
-		if(obj.isNull()) {
+        if (obj.isMultiValued()) {
+        	constantParts = new Object[] {"?"}; //$NON-NLS-1$
+        } else if(obj.isNull()) {
 			constantParts = new Object[] {"null"}; //$NON-NLS-1$
 		} else {
 		    try {

Modified: trunk/engine/src/main/java/com/metamatrix/query/tempdata/TempTableStoreImpl.java
===================================================================
--- trunk/engine/src/main/java/com/metamatrix/query/tempdata/TempTableStoreImpl.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/com/metamatrix/query/tempdata/TempTableStoreImpl.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -48,12 +48,12 @@
 import com.metamatrix.query.metadata.TempMetadataStore;
 import com.metamatrix.query.processor.proc.UpdateCountTupleSource;
 import com.metamatrix.query.resolver.util.ResolverUtil;
-import com.metamatrix.query.sql.lang.BulkInsert;
 import com.metamatrix.query.sql.lang.Command;
 import com.metamatrix.query.sql.lang.Create;
 import com.metamatrix.query.sql.lang.Drop;
 import com.metamatrix.query.sql.lang.Insert;
 import com.metamatrix.query.sql.lang.Query;
+import com.metamatrix.query.sql.symbol.Constant;
 import com.metamatrix.query.sql.symbol.ElementSymbol;
 import com.metamatrix.query.sql.symbol.Expression;
 import com.metamatrix.query.sql.symbol.GroupSymbol;
@@ -178,7 +178,7 @@
                 return new UpdateCountTupleSource(0);
             }
         }
-        throw new AssertionError("unhandled temp table reqest");
+        throw new AssertionError("unhandled temp table reqest"); //$NON-NLS-1$
     }
     
     public void removeTempTables() throws MetaMatrixComponentException{
@@ -225,8 +225,8 @@
             TupleBatch tupleBatch;
             List elements = ResolverUtil.resolveElementsInGroup(group, new TempMetadataAdapter(null, tempMetadataStore));
             
-            if ( insert instanceof BulkInsert ) {
-                List tuples = ((BulkInsert)insert).getRows();
+            if ( insert.isBulk() ) {
+                List<List<Object>> tuples = getBulkRows(insert);
                 
                 tuplesAdded = tuples.size();
 
@@ -261,6 +261,23 @@
         
         return new UpdateCountTupleSource(tuplesAdded);
     }
+
+	public static List<List<Object>> getBulkRows(Insert insert) {
+		Constant c = (Constant)insert.getValues().get(0);
+		int bulkRowCount = ((List<?>)c.getValue()).size();
+		
+		List<List<Object>> tuples = new ArrayList<List<Object>>(bulkRowCount);
+		
+		for (int row = 0; row < bulkRowCount; row++) {
+			List<Object> currentRow = new ArrayList<Object>(insert.getValues().size());
+		    for (int i = 0; i < insert.getValues().size(); i++) {
+		    	Constant multiValue = (Constant)insert.getValues().get(i);
+		    	currentRow.add(((List<?>)multiValue.getValue()).get(row));
+		    }
+		    tuples.add(currentRow);
+		}
+		return tuples;
+	}
     
     public boolean hasTempTable(Command command){
         switch (command.getType()) {

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/CapabilitiesConverter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/CapabilitiesConverter.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/CapabilitiesConverter.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -83,7 +83,7 @@
         tgtCaps.setCapabilitySupport(Capability.QUERY_INTERSECT, srcCaps.supportsIntersect());
         tgtCaps.setCapabilitySupport(Capability.QUERY_EXCEPT, srcCaps.supportsExcept());
         tgtCaps.setCapabilitySupport(Capability.QUERY_SET_ORDER_BY, srcCaps.supportsSetQueryOrderBy());
-        tgtCaps.setCapabilitySupport(Capability.BULK_INSERT , srcCaps.supportsBulkInsert());
+        tgtCaps.setCapabilitySupport(Capability.BULK_UPDATE , srcCaps.supportsBulkUpdate());
         tgtCaps.setCapabilitySupport(Capability.BATCHED_UPDATES, srcCaps.supportsBatchedUpdates());
         tgtCaps.setCapabilitySupport(Capability.QUERY_FUNCTIONS_IN_GROUP_BY, srcCaps.supportsFunctionsInGroupBy());
         tgtCaps.setCapabilitySupport(Capability.ROW_LIMIT, srcCaps.supportsRowLimit());
@@ -92,6 +92,7 @@
         tgtCaps.setCapabilitySupport(Capability.REQUIRES_CRITERIA, srcCaps.requiresCriteria());
         tgtCaps.setCapabilitySupport(Capability.QUERY_GROUP_BY, srcCaps.supportsGroupBy());
         tgtCaps.setCapabilitySupport(Capability.QUERY_HAVING, srcCaps.supportsHaving());
+        tgtCaps.setCapabilitySupport(Capability.INSERT_WITH_QUERYEXPRESSION, srcCaps.supportsInsertWithQueryExpression());
         
         List functions = srcCaps.getSupportedFunctions();
         if(functions != null && functions.size() > 0) {

Deleted: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/BulkInsertImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/BulkInsertImpl.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/BulkInsertImpl.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -1,87 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.dqp.internal.datamgr.language;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.teiid.connector.language.IBulkInsert;
-import org.teiid.connector.language.IGroup;
-import org.teiid.connector.visitor.framework.LanguageObjectVisitor;
-
-
-
-/**
- * A simple variation of insert where multiple rows can be inserted as single
- * operation.
- */
-public class BulkInsertImpl extends InsertImpl implements IBulkInsert {
-    List rowValues = null;
-        
-    public BulkInsertImpl(IGroup group, List elements) {
-        super(group, elements, null);
-    }
-    
-    public BulkInsertImpl(IGroup group, List elements, List rows) {
-        super(group, elements, null);
-        this.rowValues = rows;
-    }
-        
-    /**
-     * @see org.teiid.connector.language.IBulkInsert#getRows()
-     */
-    public List getRows() {
-        if (rowValues == null) {
-            return Collections.EMPTY_LIST;
-        }
-        return rowValues;
-    }
-    
-    /**
-     * Set the list of row values for this bulk insert  
-     * @return list; never null
-     */
-    public void setRows(List rows) {
-        rowValues = rows;
-    }
-    
-    /**
-     * @see org.teiid.connector.language.IInsert#getValues()
-     */
-    public List getValues() {
-        throw new UnsupportedOperationException("This operation is not supported"); //$NON-NLS-1$
-    }
-    /**
-     * @see org.teiid.connector.language.IInsert#setValues(java.util.List)
-     */
-    public void setValues(List values) {
-        throw new UnsupportedOperationException("This operation is not supported"); //$NON-NLS-1$        
-    }
-    
-    /**
-     * @see org.teiid.connector.language.ILanguageObject#acceptVisitor(com.metamatrix.data.visitor.LanguageObjectVisitor)
-     */
-    public void acceptVisitor(LanguageObjectVisitor visitor) {
-        visitor.visit(this);
-    }       
-}

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/InsertImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/InsertImpl.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/InsertImpl.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -26,19 +26,20 @@
 
 import org.teiid.connector.language.IGroup;
 import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertValueSource;
 import org.teiid.connector.visitor.framework.LanguageObjectVisitor;
 
 
 public class InsertImpl extends BaseLanguageObject implements IInsert {
     
-    private IGroup group = null;
-    private List elements = null;
-    private List values = null;
+    private IGroup group;
+    private List elements;
+    private IInsertValueSource valueSource;
   
-    public InsertImpl(IGroup group, List elements, List values) {
+    public InsertImpl(IGroup group, List elements, IInsertValueSource valueSource) {
         this.group = group;
         this.elements = elements;
-        this.values = values;
+        this.valueSource = valueSource;
     }
     /**
      * @see org.teiid.connector.language.IInsert#getGroup()
@@ -55,10 +56,10 @@
     }
 
     /**
-     * @see org.teiid.connector.language.IInsert#getValues()
+     * @see org.teiid.connector.language.IInsert#getValueSource()
      */
-    public List getValues() {
-        return values;
+    public IInsertValueSource getValueSource() {
+        return valueSource;
     }
 
     /**
@@ -79,11 +80,10 @@
     public void setElements(List elements) {
         this.elements = elements;
     }
-    /* 
-     * @see com.metamatrix.data.language.IInsert#setValues(java.util.List)
-     */
-    public void setValues(List values) {
-        this.values = values;
+    
+    @Override
+    public void setValueSource(IInsertValueSource values) {
+    	this.valueSource = values;
     }
 
 }

Added: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/InsertValueExpressionsImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/InsertValueExpressionsImpl.java	                        (rev 0)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/InsertValueExpressionsImpl.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -0,0 +1,27 @@
+package org.teiid.dqp.internal.datamgr.language;
+
+import java.util.List;
+
+import org.teiid.connector.language.IExpression;
+import org.teiid.connector.language.IInsertExpressionValueSource;
+import org.teiid.connector.visitor.framework.LanguageObjectVisitor;
+
+public class InsertValueExpressionsImpl extends BaseLanguageObject implements IInsertExpressionValueSource {
+
+	private List<IExpression> values;
+	
+	public InsertValueExpressionsImpl(List<IExpression> values) {
+		this.values = values;
+	}
+
+	@Override
+	public List<IExpression> getValues() {
+		return values;
+	}
+
+	@Override
+	public void acceptVisitor(LanguageObjectVisitor visitor) {
+		visitor.visit(this);
+	}
+	
+}


Property changes on: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/InsertValueExpressionsImpl.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageBridgeFactory.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageBridgeFactory.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageBridgeFactory.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -44,6 +44,7 @@
 import org.teiid.connector.language.IGroupBy;
 import org.teiid.connector.language.IInCriteria;
 import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertValueSource;
 import org.teiid.connector.language.IIsNullCriteria;
 import org.teiid.connector.language.IJoin;
 import org.teiid.connector.language.ILikeCriteria;
@@ -79,7 +80,6 @@
 import com.metamatrix.query.metadata.QueryMetadataInterface;
 import com.metamatrix.query.metadata.TempMetadataID;
 import com.metamatrix.query.sql.lang.BatchedUpdateCommand;
-import com.metamatrix.query.sql.lang.BulkInsert;
 import com.metamatrix.query.sql.lang.Command;
 import com.metamatrix.query.sql.lang.CompareCriteria;
 import com.metamatrix.query.sql.lang.CompoundCriteria;
@@ -119,7 +119,6 @@
 import com.metamatrix.query.sql.symbol.ExpressionSymbol;
 import com.metamatrix.query.sql.symbol.Function;
 import com.metamatrix.query.sql.symbol.GroupSymbol;
-import com.metamatrix.query.sql.symbol.Reference;
 import com.metamatrix.query.sql.symbol.ScalarSubquery;
 import com.metamatrix.query.sql.symbol.SearchedCaseExpression;
 import com.metamatrix.query.sql.symbol.SingleElementSymbol;
@@ -468,8 +467,6 @@
             return translate((Constant)expr);
         } else if (expr instanceof Function) {
             return translate((Function)expr);
-        } else if (expr instanceof Reference) {
-            return translate((Reference)expr);
         } else if (expr instanceof ScalarSubquery) {
             return translate((ScalarSubquery)expr);
         } else if (expr instanceof SearchedCaseExpression) {
@@ -481,7 +478,10 @@
     }
 
     ILiteral translate(Constant constant) {
-        return new LiteralImpl(constant.getValue(), constant.getType());
+        LiteralImpl result = new LiteralImpl(constant.getValue(), constant.getType());
+        result.setBindValue(constant.isMultiValued());
+        result.setMultiValued(constant.isMultiValued());
+        return result;
     }
 
     IFunction translate(Function function) throws MetaMatrixComponentException {
@@ -495,10 +495,6 @@
         return new FunctionImpl(function.getName(), params, function.getType());
     }
 
-    IExpression translate(Reference ref) throws MetaMatrixComponentException {
-        return translate(ref.getExpression());
-    }
-
     ISearchedCaseExpression translate(SearchedCaseExpression expr) throws MetaMatrixComponentException {
         ArrayList whens = new ArrayList(), thens = new ArrayList();
         for (int i = 0; i < expr.getWhenCount(); i++) {
@@ -570,32 +566,31 @@
             translatedElements.add(translate((ElementSymbol)i.next()));
         }
         
-        // If the insert is bulk insert then translate the multiple values
-        if (insert instanceof BulkInsert) {
-            BulkInsert bulkInsert = (BulkInsert)insert;
-            BulkInsertImpl translatedBulkInsert = 
-                new BulkInsertImpl(translate(insert.getGroup()),translatedElements);
-            List rows = bulkInsert.getRows();
-            translatedBulkInsert.setRows(rows);
-            return translatedBulkInsert;
+        IInsertValueSource valueSource = null;
+        if (insert.getQueryExpression() != null) {
+        	valueSource = translate(insert.getQueryExpression());
+        } else {
+            // This is for the simple one row insert.
+            List values = insert.getValues();
+            List translatedValues = new ArrayList();
+            for (Iterator i = values.iterator(); i.hasNext();) {
+                translatedValues.add(translate((Expression)i.next()));
+            }
+            valueSource = new InsertValueExpressionsImpl(translatedValues);
         }
         
-        // This is for the simple one row insert.
-        List values = insert.getValues();
-        List translatedValues = new ArrayList();
-        for (Iterator i = values.iterator(); i.hasNext();) {
-            translatedValues.add(translate((Expression)i.next()));
-        }
-        return new InsertImpl(translate(insert.getGroup()),
+        InsertImpl result = new InsertImpl(translate(insert.getGroup()),
                               translatedElements,
-                              translatedValues);
+                              valueSource);
+        return result;
     }
 
     /* Update */
     IUpdate translate(Update update) throws MetaMatrixComponentException {
-        return new UpdateImpl(translate(update.getGroup()),
+        UpdateImpl updateImpl =  new UpdateImpl(translate(update.getGroup()),
                               translate(update.getChangeList()),
                               translate(update.getCriteria()));
+        return updateImpl;
     }
     
     ISetClauseList translate(SetClauseList setClauseList) throws MetaMatrixComponentException {
@@ -612,8 +607,9 @@
 
     /* Delete */
     IDelete translate(Delete delete) throws MetaMatrixComponentException {
-        return new DeleteImpl(translate(delete.getGroup()),
+        DeleteImpl deleteImpl = new DeleteImpl(translate(delete.getGroup()),
                               translate(delete.getCriteria()));
+        return deleteImpl;
     }
 
     /* Execute */
@@ -636,7 +632,7 @@
         return new ProcedureImpl(sp.getProcedureName(), translatedParameters, proc);
     }
 
-    IParameter translate(SPParameter param, Procedure parent) throws MetaMatrixComponentException {
+    IParameter translate(SPParameter param, Procedure parent) {
         Direction direction = Direction.IN;
         switch(param.getParameterType()) {
             case ParameterInfo.IN:    

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageFactoryImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageFactoryImpl.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LanguageFactoryImpl.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -26,7 +26,6 @@
 import java.util.List;
 
 import org.teiid.connector.language.IAggregate;
-import org.teiid.connector.language.IBulkInsert;
 import org.teiid.connector.language.ICompareCriteria;
 import org.teiid.connector.language.ICompoundCriteria;
 import org.teiid.connector.language.ICriteria;
@@ -42,6 +41,8 @@
 import org.teiid.connector.language.IInCriteria;
 import org.teiid.connector.language.IInlineView;
 import org.teiid.connector.language.IInsert;
+import org.teiid.connector.language.IInsertExpressionValueSource;
+import org.teiid.connector.language.IInsertValueSource;
 import org.teiid.connector.language.IIsNullCriteria;
 import org.teiid.connector.language.IJoin;
 import org.teiid.connector.language.ILanguageFactory;
@@ -136,14 +137,15 @@
     
     @Override
     public IFunction createFunction(String functionName, IExpression[] args,
-    		Class type) {
+    		Class<?> type) {
     	return new FunctionImpl(functionName, Arrays.asList(args), type);
     }
 
     /* 
      * @see com.metamatrix.data.language.ILanguageFactory#createFunction(java.lang.String, com.metamatrix.data.language.IExpression[], java.lang.Class)
      */
-    public IFunction createFunction(String functionName, List<? extends IExpression> args, Class type) {
+    @Override
+    public IFunction createFunction(String functionName, List<? extends IExpression> args, Class<?> type) {
         return new FunctionImpl(functionName, args, type);
     }
 
@@ -167,19 +169,17 @@
     public IInCriteria createInCriteria(IExpression leftExpression, List rightExpressions, boolean isNegated) {
         return new InCriteriaImpl(leftExpression, rightExpressions, isNegated);
     }
-
-    /* 
-     * @see com.metamatrix.data.language.ILanguageFactory#createInsert(com.metamatrix.data.language.IGroup, java.util.List, java.util.List)
-     */
-    public IInsert createInsert(IGroup group, List columns, List values) {
-        return new InsertImpl(group, columns, values);
+    
+    @Override
+    public IInsert createInsert(IGroup group, List<IElement> columns,
+    		IInsertValueSource valueSource) {
+        return new InsertImpl(group, columns, valueSource);
     }
-
-    /**
-     * @see org.teiid.connector.language.ILanguageFactory#createBulkInsert(org.teiid.connector.language.IGroup, java.util.List, java.util.List)
-     */
-    public IBulkInsert createBulkInsert(IGroup group, List columns, List rows) {
-        return new BulkInsertImpl(group, columns, rows);
+    
+    @Override
+    public IInsertExpressionValueSource createInsertExpressionValueSource(
+    		List<IExpression> values) {
+    	return new InsertValueExpressionsImpl(values);
     }
     
     /* 

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LiteralImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LiteralImpl.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/LiteralImpl.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -27,11 +27,12 @@
 
 public class LiteralImpl extends BaseLanguageObject implements ILiteral {
     
-    Object value;
-    Class type;
-    private boolean bindValue = false;
+    private Object value;
+    private Class<?> type;
+    private boolean bindValue;
+    private boolean multiValued;
     
-    public LiteralImpl(Object value, Class type) {
+    public LiteralImpl(Object value, Class<?> type) {
         this.value = value;
         this.type = type;
     }
@@ -53,7 +54,7 @@
     /* 
      * @see com.metamatrix.data.language.ILiteral#getType()
      */
-    public Class getType() {
+    public Class<?> getType() {
         return this.type;
     }
 
@@ -64,13 +65,6 @@
         this.value = value;
     }
 
-    /* 
-     * @see com.metamatrix.data.language.ILiteral#setType(java.lang.Class)
-     */
-    public void setType(Class type) {
-        this.type = type;
-    }
-
     /** 
      * @see org.teiid.connector.language.ILiteral#isBindValue()
      */
@@ -85,4 +79,19 @@
         this.bindValue = bindValue;
     }
 
+	@Override
+	public boolean isMultiValued() {
+		return multiValued;
+	}
+
+	@Override
+	public void setMultiValued(boolean multiValued) {
+		this.multiValued = multiValued;
+	}
+
+	@Override
+	public void setType(Class<?> type) {
+		this.type = type;
+	}
+
 }

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/ProcedureImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/ProcedureImpl.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/ProcedureImpl.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -22,7 +22,6 @@
 
 package org.teiid.dqp.internal.datamgr.language;
 
-import java.util.Iterator;
 import java.util.List;
 
 import org.teiid.connector.api.ConnectorException;

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/SetClauseImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/SetClauseImpl.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/SetClauseImpl.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -27,7 +27,7 @@
 import org.teiid.connector.language.ISetClause;
 import org.teiid.connector.visitor.framework.LanguageObjectVisitor;
 
-public class SetClauseImpl implements ISetClause {
+public class SetClauseImpl extends BaseLanguageObject implements ISetClause {
 
 	private IElement symbol;
 	private IExpression value;

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/SetClauseListImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/SetClauseListImpl.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/language/SetClauseListImpl.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -30,7 +30,7 @@
 import org.teiid.connector.visitor.framework.LanguageObjectVisitor;
 
 
-public class SetClauseListImpl implements ISetClauseList {
+public class SetClauseListImpl extends BaseLanguageObject implements ISetClauseList {
 
 	private List<ISetClause> clauses;
 	

Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -22,6 +22,7 @@
 
 package org.teiid.dqp.internal.process;
 
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -193,29 +194,38 @@
      */
 	private void handlePreparedBatchUpdate() throws QueryMetadataException,
 			MetaMatrixComponentException, QueryResolverException, QueryPlannerException, QueryValidatorException {
-		ProcessorPlan plan = this.processPlan;
 		List<List<?>> paramValues = requestMsg.getParameterValues();
 		if (paramValues.isEmpty()) {
 			throw new QueryValidatorException("No batch values sent for prepared batch update"); //$NON-NLS-1$
 		}
 		boolean supportPreparedBatchUpdate = false;
-		if (plan instanceof RelationalPlan) {
-			RelationalPlan rPlan = (RelationalPlan)plan;
+		if (this.processPlan instanceof RelationalPlan && this.prepPlan.getRewritenCommand().getSubCommands().isEmpty()) {
+			RelationalPlan rPlan = (RelationalPlan)this.processPlan;
 			if (rPlan.getRootNode() instanceof AccessNode) {
 				AccessNode aNode = (AccessNode)rPlan.getRootNode();
-			    String modelName = aNode.getModelName();
+				String modelName = aNode.getModelName();
 		        SourceCapabilities caps = capabilitiesFinder.findCapabilities(modelName);
-		        supportPreparedBatchUpdate = caps.supportsCapability(SourceCapabilities.Capability.PREPARED_BATCH_UPDATE);
+		        supportPreparedBatchUpdate = caps.supportsCapability(SourceCapabilities.Capability.BULK_UPDATE);
 			}
 		}
 		CommandTreeNode ctn = new CommandTreeNode();
 		List<Command> commands = new LinkedList<Command>();
 		List<VariableContext> contexts = new LinkedList<VariableContext>();
+		List<List<Object>> multiValues = new ArrayList<List<Object>>(this.prepPlan.getReferences().size());
 		for (List<?> values : paramValues) {
 			resolveAndValidateParameters(this.userCommand, this.prepPlan.getReferences(), values);
 			contexts.add(this.context.getVariableContext());
 			if(supportPreparedBatchUpdate){
-				continue; // -- TODO make this work
+				if (multiValues.isEmpty()) {
+					for (int i = 0; i < values.size(); i++) {
+						multiValues.add(new ArrayList<Object>(paramValues.size()));
+					}					
+				}
+				for (int i = 0; i < values.size(); i++) {
+					List<Object> multiValue = multiValues.get(i);
+					multiValue.add(values.get(i));
+				}
+				continue; 
 			}
 			Command c = (Command)this.prepPlan.getRewritenCommand().clone();
 			commands.add(c);
@@ -229,10 +239,19 @@
 			this.context.setVariableContext(new VariableContext());
 		} 
 		
-		if (supportPreparedBatchUpdate || paramValues.size() == 1) {
-			return; // just use the existing plan
+		if (paramValues.size() == 1) {
+			return; // just use the existing plan, and global reference evaluation
 		}
 		
+		if (supportPreparedBatchUpdate) {
+			for (int i = 0; i < this.prepPlan.getReferences().size(); i++) {
+				Constant c = new Constant(null, this.prepPlan.getReferences().get(i).getType());
+				c.setMultiValued(multiValues.get(i));
+				this.context.getVariableContext().setGlobalValue(this.prepPlan.getReferences().get(i).getContextSymbol(), c);
+			}
+			return;
+		}
+		
 		BatchedUpdateCommand buc = new BatchedUpdateCommand(commands);
 		ctn.setCommand(buc);
 		ctn.setProperty(RelationalPlanner.VARIABLE_CONTEXTS, contexts);

Added: trunk/engine/src/test/java/com/metamatrix/query/processor/TestInsertProcessing.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/processor/TestInsertProcessing.java	                        (rev 0)
+++ trunk/engine/src/test/java/com/metamatrix/query/processor/TestInsertProcessing.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -0,0 +1,396 @@
+package com.metamatrix.query.processor;
+
+import static com.metamatrix.query.processor.TestProcessor.*;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.metamatrix.common.types.DataTypeManager;
+import com.metamatrix.query.optimizer.TestOptimizer;
+import com.metamatrix.query.optimizer.capabilities.BasicSourceCapabilities;
+import com.metamatrix.query.optimizer.capabilities.FakeCapabilitiesFinder;
+import com.metamatrix.query.optimizer.capabilities.SourceCapabilities.Capability;
+import com.metamatrix.query.sql.lang.BatchedUpdateCommand;
+import com.metamatrix.query.sql.lang.Command;
+import com.metamatrix.query.sql.lang.Insert;
+import com.metamatrix.query.sql.symbol.Constant;
+import com.metamatrix.query.unittest.FakeMetadataFacade;
+import com.metamatrix.query.unittest.FakeMetadataFactory;
+import com.metamatrix.query.unittest.FakeMetadataObject;
+import com.metamatrix.query.unittest.FakeMetadataStore;
+
+public class TestInsertProcessing {
+	
+    @Test public void testSelectIntoWithTypeConversion() {
+        FakeMetadataObject pm1 = FakeMetadataFactory.createPhysicalModel("pm1"); //$NON-NLS-1$
+        FakeMetadataObject pm1g1 = FakeMetadataFactory.createPhysicalGroup("pm1.g1", pm1); //$NON-NLS-1$
+        
+        FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder(); 
+        BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities(); 
+        caps.setCapabilitySupport(Capability.BATCHED_UPDATES, true); 
+        capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$ 
+
+        List pm1g1e = FakeMetadataFactory.createElements(pm1g1, 
+                                    new String[] { "e1", "e2", "e3" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
+                                    new String[] { DataTypeManager.DefaultDataTypes.BIG_INTEGER, DataTypeManager.DefaultDataTypes.FLOAT, DataTypeManager.DefaultDataTypes.FLOAT});
+                                
+        FakeMetadataStore store = new FakeMetadataStore();
+        store.addObject(pm1);
+        store.addObject(pm1g1);     
+        store.addObjects(pm1g1e);
+        
+        FakeMetadataFacade metadata = new FakeMetadataFacade(store);
+        
+        HardcodedDataManager dataManager = new HardcodedDataManager();
+        dataManager.addData("BatchedUpdate{I}",  //$NON-NLS-1$ 
+                            new List[] { Arrays.asList(new Object[] { new Integer(1) })}); 
+        
+        String sql = "SELECT 1, 1, 1 INTO pm1.g1"; //$NON-NLS-1$
+        
+        Command command = helpParse(sql); 
+        ProcessorPlan plan = helpGetPlan(command, metadata, capFinder); 
+        
+        List[] expected = new List[] {   
+            Arrays.asList(new Object[] { new Integer(1) }), 
+        }; 
+        
+        helpProcess(plan, dataManager, expected);
+        
+        BatchedUpdateCommand buc = (BatchedUpdateCommand)dataManager.getCommandHistory().iterator().next();
+        Insert insert = (Insert)buc.getUpdateCommands().get(0);
+                
+        Constant value0 = (Constant)insert.getValues().get(0);
+        Constant value1 = (Constant)insert.getValues().get(1);
+        
+        assertEquals(DataTypeManager.DefaultDataClasses.BIG_INTEGER, value0.getValue().getClass());
+        assertEquals(DataTypeManager.DefaultDataClasses.FLOAT, value1.getValue().getClass());
+    }
+    
+    
+    @Test public void testSelectInto_Case5569a_BATCH_NO_BULK_NO() {
+        boolean doBatching  = false;
+        boolean doBulkInsert = false;
+        helpSelectInto_Case5569Processor( doBatching, doBulkInsert );
+    }    
+    
+    @Test public void testSelectInto_Case5569b_BATCH_YES_BULK_NO() {
+        boolean doBatching  = true;
+        boolean doBulkInsert = false;
+        helpSelectInto_Case5569Processor( doBatching, doBulkInsert );
+    }
+    
+    @Test public void testSelectInto_Case5569c_BATCH_NO_BULK_YES() {
+        boolean doBatching  = false;
+        boolean doBulkInsert = true;
+        helpSelectInto_Case5569Processor( doBatching, doBulkInsert );
+    }
+
+    public void helpSelectInto_Case5569Processor( boolean doBatching, boolean doBulkInsert ) {
+        
+        FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder(); 
+        BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities(); 
+ 
+        caps.setCapabilitySupport(Capability.BATCHED_UPDATES, doBatching); 
+        caps.setCapabilitySupport(Capability.BULK_UPDATE, doBulkInsert); 
+        caps.setCapabilitySupport(Capability.QUERY_FROM_GROUP_ALIAS, false);
+
+        capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$ 
+
+        FakeMetadataFacade metadata = FakeMetadataFactory.example1();
+        
+        HardcodedDataManager dataManager = new HardcodedDataManager();
+
+        dataManager.addData("SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1",  //$NON-NLS-1$ 
+                            new List[] { Arrays.asList(new Object[] { "1", new Integer(1), Boolean.FALSE, new Double(1)}),     //$NON-NLS-1$
+                                         Arrays.asList(new Object[] { "2", new Integer(2), Boolean.TRUE, new Double(2) })});    //$NON-NLS-1$
+        
+        if (doBulkInsert) {
+            dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES (?, ?, ?, ?)",  //$NON-NLS-1$ 
+                                new List[] { Arrays.asList(new Object[] { new Integer(2)})});             
+        } 
+        else 
+        if (doBatching) {
+            dataManager.addData("BatchedUpdate{I,I}",  //$NON-NLS-1$ 
+                                new List[] { Arrays.asList(new Object[] { new Integer(2)})});             
+        } else {
+            dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)",  //$NON-NLS-1$ 
+                                new List[] { Arrays.asList(new Object[] { new Integer(1)})});
+            dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)",  //$NON-NLS-1$ 
+                                new List[] { Arrays.asList(new Object[] { new Integer(1)})});             
+        }
+
+        String sql = "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 INTO pm1.g2 from pm1.g1"; //$NON-NLS-1$
+        
+        Command command = helpParse(sql); 
+
+        ProcessorPlan plan = helpGetPlan(command, metadata, capFinder); 
+        
+        List[] expected = new List[] {   
+            Arrays.asList(new Object[] { new Integer(2) }), 
+        }; 
+        
+        helpProcess(plan, dataManager, expected);
+        
+        // if not doBulkInsert and is doBatching,
+        //    check the command hist to ensure it contains the expected commands
+        if ( !doBulkInsert && doBatching ) {
+            BatchedUpdateCommand bu = (BatchedUpdateCommand)new ArrayList(dataManager.getCommandHistory()).get(1);
+            assertEquals(2, bu.getUpdateCommands().size());
+            assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)", bu.getUpdateCommands().get(0).toString() );  //$NON-NLS-1$
+            assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)", bu.getUpdateCommands().get(1).toString() );  //$NON-NLS-1$ 
+        }        
+    }
+    
+
+    @Test public void testSelectInto_Case5412a() {
+        
+        // test setting BULK_INSERT capability to true
+        FakeMetadataObject pm1 = FakeMetadataFactory.createPhysicalModel("pm1"); //$NON-NLS-1$
+        FakeMetadataObject pm1g1 = FakeMetadataFactory.createPhysicalGroup("pm1.g1", pm1); //$NON-NLS-1$
+        
+        FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder(); 
+        BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities(); 
+ 
+        caps.setCapabilitySupport(Capability.BULK_UPDATE, true); 
+        capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$ 
+
+        List pm1g1e = FakeMetadataFactory.createElements(pm1g1, 
+                                    new String[] { "e1", "e2" }, //$NON-NLS-1$ //$NON-NLS-2$ 
+                                    new String[] { DataTypeManager.DefaultDataTypes.BIG_INTEGER, DataTypeManager.DefaultDataTypes.FLOAT});
+                                
+        FakeMetadataStore store = new FakeMetadataStore();
+        store.addObject(pm1);
+        store.addObject(pm1g1);     
+        store.addObjects(pm1g1e);
+        
+        FakeMetadataFacade metadata = new FakeMetadataFacade(store);
+        
+        HardcodedDataManager dataManager = new HardcodedDataManager();
+        dataManager.addData("INSERT INTO pm1.g1 (pm1.g1.e1, pm1.g1.e2) VALUES (?, ?)",  //$NON-NLS-1$ 
+                            new List[] { Arrays.asList(new Object[] { new Integer(1) })}); 
+        
+        String sql = "SELECT 1, 1 INTO pm1.g1"; //$NON-NLS-1$
+        
+        Command command = helpParse(sql); 
+        ProcessorPlan plan = helpGetPlan(command, metadata, capFinder); 
+        
+        List[] expected = new List[] {   
+            Arrays.asList(new Object[] { new Integer(1) }), 
+        }; 
+        
+        helpProcess(plan, dataManager, expected);
+        
+        Insert insert = (Insert)dataManager.getCommandHistory().iterator().next();
+        //List lst = (List)insert.getParameterValues().get(0);
+        //Object value0 = lst.get(0);
+        //Object value1 = lst.get(1);
+        
+        //assertEquals(DataTypeManager.DefaultDataClasses.BIG_INTEGER, value0.getClass());
+        //assertEquals(DataTypeManager.DefaultDataClasses.FLOAT, value1.getClass());
+    }
+
+    
+    @Test public void testSelectInto_Case5412b() {
+        
+        // test setting BULK_INSERT capability to false
+        FakeMetadataObject pm1 = FakeMetadataFactory.createPhysicalModel("pm1"); //$NON-NLS-1$
+        FakeMetadataObject pm1g1 = FakeMetadataFactory.createPhysicalGroup("pm1.g1", pm1); //$NON-NLS-1$
+        
+        FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder(); 
+        BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities(); 
+ 
+        caps.setCapabilitySupport(Capability.BULK_UPDATE, false); 
+        capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$ 
+
+        List pm1g1e = FakeMetadataFactory.createElements(pm1g1, 
+                                    new String[] { "e1", "e2" }, //$NON-NLS-1$ //$NON-NLS-2$ 
+                                    new String[] { DataTypeManager.DefaultDataTypes.BIG_INTEGER, DataTypeManager.DefaultDataTypes.FLOAT});
+                                
+        FakeMetadataStore store = new FakeMetadataStore();
+        store.addObject(pm1);
+        store.addObject(pm1g1);     
+        store.addObjects(pm1g1e);
+        
+        FakeMetadataFacade metadata = new FakeMetadataFacade(store);
+        
+        HardcodedDataManager dataManager = new HardcodedDataManager();
+        dataManager.addData("INSERT INTO pm1.g1 (pm1.g1.e1, pm1.g1.e2) VALUES (1, 1.0)",  //$NON-NLS-1$ 
+                            new List[] { Arrays.asList(new Object[] { new Integer(1) })}); 
+        
+        String sql = "SELECT 1, 1 INTO pm1.g1"; //$NON-NLS-1$
+        
+        Command command = helpParse(sql); 
+        ProcessorPlan plan = helpGetPlan(command, metadata, capFinder); 
+        
+        List[] expected = new List[] {   
+            Arrays.asList(new Object[] { new Integer(1) }), 
+        }; 
+        
+        helpProcess(plan, dataManager, expected);
+        
+        Insert insert = (Insert)dataManager.getCommandHistory().iterator().next();
+        
+        Constant value0 = (Constant)insert.getValues().get(0);
+        Constant value1 = (Constant)insert.getValues().get(1);
+        
+        assertEquals(DataTypeManager.DefaultDataClasses.BIG_INTEGER, value0.getValue().getClass());
+        assertEquals(DataTypeManager.DefaultDataClasses.FLOAT, value1.getValue().getClass());
+    }
+    
+    @Test public void testInsertIntoWithSubquery_None() {
+        helpInsertIntoWithSubquery( null );
+    }    
+    
+    @Test public void testInsertIntoWithSubquery_Batch() {
+        helpInsertIntoWithSubquery( Capability.BATCHED_UPDATES );
+    }
+    
+    @Test public void testInsertIntoWithSubquery_Bulk() {
+        helpInsertIntoWithSubquery( Capability.BULK_UPDATE );
+    }
+    
+    @Test public void testInsertIntoWithSubquery_Pushdown() {
+        helpInsertIntoWithSubquery( Capability.INSERT_WITH_QUERYEXPRESSION );
+    }
+
+    public void helpInsertIntoWithSubquery( Capability cap ) {
+        
+        FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder(); 
+        BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities(); 
+ 
+        caps.setCapabilitySupport(cap, true);
+        caps.setCapabilitySupport(Capability.QUERY_FROM_GROUP_ALIAS, false);
+
+        capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$ 
+
+        FakeMetadataFacade metadata = FakeMetadataFactory.example1();
+        
+        HardcodedDataManager dataManager = new HardcodedDataManager();
+
+        dataManager.addData("SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1",  //$NON-NLS-1$ 
+                            new List[] { Arrays.asList(new Object[] { "1", new Integer(1), Boolean.FALSE, new Double(1)}),     //$NON-NLS-1$
+                                         Arrays.asList(new Object[] { "2", new Integer(2), Boolean.TRUE, new Double(2) })});    //$NON-NLS-1$
+        
+        if (cap != null) {
+        	switch (cap) {
+	        case BULK_UPDATE:
+	            dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES (?, ?, ?, ?)",  //$NON-NLS-1$ 
+	                    new List[] { Arrays.asList(new Object[] { new Integer(2)})});
+	            break;
+	        case BATCHED_UPDATES:
+	            dataManager.addData("BatchedUpdate{I,I}",  //$NON-NLS-1$ 
+	                    new List[] { Arrays.asList(new Object[] { new Integer(2)})});
+	            break;
+	        case INSERT_WITH_QUERYEXPRESSION:
+	        	dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1",  //$NON-NLS-1$ 
+	                    new List[] { Arrays.asList(new Object[] { new Integer(2)})});
+	        	break;
+	        }
+        } else {
+            dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)",  //$NON-NLS-1$ 
+                                new List[] { Arrays.asList(new Object[] { new Integer(1)})});
+            dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)",  //$NON-NLS-1$ 
+                                new List[] { Arrays.asList(new Object[] { new Integer(1)})});             
+        }
+
+        String sql = "INSERT INTO pm1.g2 SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 from pm1.g1"; //$NON-NLS-1$
+        
+        Command command = helpParse(sql); 
+
+        ProcessorPlan plan = helpGetPlan(command, metadata, capFinder); 
+        
+        List[] expected = new List[] {   
+            Arrays.asList(new Object[] { new Integer(2) }), 
+        }; 
+        
+        helpProcess(plan, dataManager, expected);
+        
+        // if not doBulkInsert and is doBatching,
+        //    check the command hist to ensure it contains the expected commands
+        if ( cap == Capability.BATCHED_UPDATES ) {
+            BatchedUpdateCommand bu = (BatchedUpdateCommand)new ArrayList(dataManager.getCommandHistory()).get(1);
+            assertEquals(2, bu.getUpdateCommands().size());
+            assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)", bu.getUpdateCommands().get(0).toString() );  //$NON-NLS-1$
+            assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)", bu.getUpdateCommands().get(1).toString() );  //$NON-NLS-1$ 
+        }        
+    }
+    
+    @Test public void testInsertIntoWithSubquery2_BATCH_NO_BULK_NO() {
+        boolean doBatching  = false;
+        boolean doBulkInsert = false;
+        helpInsertIntoWithSubquery2( doBatching, doBulkInsert );
+    }    
+    
+    @Test public void testInsertIntoWithSubquery2_BATCH_YES_BULK_NO() {
+        boolean doBatching  = true;
+        boolean doBulkInsert = false;
+        helpInsertIntoWithSubquery2( doBatching, doBulkInsert );
+    }
+    
+    @Test public void testInsertIntoWithSubquery2_BATCH_NO_BULK_YES() {
+        boolean doBatching  = false;
+        boolean doBulkInsert = true;
+        helpInsertIntoWithSubquery2( doBatching, doBulkInsert );
+    }
+
+    public void helpInsertIntoWithSubquery2( boolean doBatching, boolean doBulkInsert ) {
+        
+        FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder(); 
+        BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities(); 
+ 
+        caps.setCapabilitySupport(Capability.BATCHED_UPDATES, doBatching); 
+        caps.setCapabilitySupport(Capability.BULK_UPDATE, doBulkInsert); 
+        caps.setCapabilitySupport(Capability.QUERY_FROM_GROUP_ALIAS, false);
+
+        capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$ 
+
+        FakeMetadataFacade metadata = FakeMetadataFactory.example1();
+        
+        HardcodedDataManager dataManager = new HardcodedDataManager();
+
+        dataManager.addData("SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1",  //$NON-NLS-1$ 
+                            new List[] { Arrays.asList(new Object[] { "1", new Integer(1), Boolean.FALSE, new Double(1)}),     //$NON-NLS-1$
+                                         Arrays.asList(new Object[] { "2", new Integer(2), Boolean.TRUE, new Double(2) })});    //$NON-NLS-1$
+        
+        if (doBulkInsert) {
+            dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES (?, ?, ?, ?)",  //$NON-NLS-1$ 
+                                new List[] { Arrays.asList(new Object[] { new Integer(2)})});             
+        } 
+        else 
+        if (doBatching) {
+            dataManager.addData("BatchedUpdate{I,I}",  //$NON-NLS-1$ 
+                                new List[] { Arrays.asList(new Object[] { new Integer(2)})});             
+        } else {
+            dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)",  //$NON-NLS-1$ 
+                                new List[] { Arrays.asList(new Object[] { new Integer(1)})});
+            dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)",  //$NON-NLS-1$ 
+                                new List[] { Arrays.asList(new Object[] { new Integer(1)})});             
+        }
+
+        String sql = "INSERT INTO pm1.g2 SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 from pm1.g1 UNION ALL SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 from pm1.g1"; //$NON-NLS-1$
+//        String sql = "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 INTO pm1.g2 from pm1.g1"; //$NON-NLS-1$
+        
+        Command command = helpParse(sql); 
+
+        ProcessorPlan plan = helpGetPlan(command, metadata, capFinder); 
+        
+        List[] expected = new List[] {   
+            Arrays.asList(new Object[] { new Integer(4) }), 
+        }; 
+        
+        helpProcess(plan, dataManager, expected);
+        
+        // if not doBulkInsert and is doBatching,
+        //    check the command hist to ensure it contains the expected commands
+        if ( !doBulkInsert && doBatching ) {
+            BatchedUpdateCommand bu = (BatchedUpdateCommand)new ArrayList(dataManager.getCommandHistory()).get(2);
+            assertEquals(2, bu.getUpdateCommands().size());
+            assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)", bu.getUpdateCommands().get(0).toString() );  //$NON-NLS-1$
+            assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)", bu.getUpdateCommands().get(1).toString() );  //$NON-NLS-1$ 
+        }        
+    }
+
+}


Property changes on: trunk/engine/src/test/java/com/metamatrix/query/processor/TestInsertProcessing.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/test/java/com/metamatrix/query/processor/TestProcessor.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -75,7 +75,6 @@
 import com.metamatrix.query.resolver.util.BindVariableVisitor;
 import com.metamatrix.query.rewriter.QueryRewriter;
 import com.metamatrix.query.sql.lang.BatchedUpdateCommand;
-import com.metamatrix.query.sql.lang.BulkInsert;
 import com.metamatrix.query.sql.lang.Command;
 import com.metamatrix.query.sql.lang.Insert;
 import com.metamatrix.query.sql.lang.SPParameter;
@@ -241,7 +240,7 @@
         }
     }
         
-    static void doProcess(ProcessorPlan plan, ProcessorDataManager dataManager, List[] expectedResults, CommandContext context) throws Exception {
+    public static void doProcess(ProcessorPlan plan, ProcessorDataManager dataManager, List[] expectedResults, CommandContext context) throws Exception {
         BufferManagerImpl bufferMgr = (BufferManagerImpl)BufferManagerFactory.getStandaloneBufferManager();
         bufferMgr.getConfig().setProcessorBatchSize(context.getProcessorBatchSize());
         bufferMgr.getConfig().setConnectorBatchSize(context.getProcessorBatchSize());
@@ -6646,223 +6645,7 @@
                                  Arrays.asList(new Object[] { new Integer(1), new Integer(1) })}); 
         helpProcess(plan, dataManager, expected);  
     }
-    
-    public void testSelectIntoWithTypeConversion() {
-        FakeMetadataObject pm1 = FakeMetadataFactory.createPhysicalModel("pm1"); //$NON-NLS-1$
-        FakeMetadataObject pm1g1 = FakeMetadataFactory.createPhysicalGroup("pm1.g1", pm1); //$NON-NLS-1$
         
-        FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder(); 
-        BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities(); 
-        caps.setCapabilitySupport(Capability.BATCHED_UPDATES, true); 
-        capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$ 
-
-        List pm1g1e = FakeMetadataFactory.createElements(pm1g1, 
-                                    new String[] { "e1", "e2", "e3" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
-                                    new String[] { DataTypeManager.DefaultDataTypes.BIG_INTEGER, DataTypeManager.DefaultDataTypes.FLOAT, DataTypeManager.DefaultDataTypes.FLOAT});
-                                
-        FakeMetadataStore store = new FakeMetadataStore();
-        store.addObject(pm1);
-        store.addObject(pm1g1);     
-        store.addObjects(pm1g1e);
-        
-        FakeMetadataFacade metadata = new FakeMetadataFacade(store);
-        
-        HardcodedDataManager dataManager = new HardcodedDataManager();
-        dataManager.addData("BatchedUpdate{I}",  //$NON-NLS-1$ 
-                            new List[] { Arrays.asList(new Object[] { new Integer(1) })}); 
-        
-        String sql = "SELECT 1, 1, 1 INTO pm1.g1"; //$NON-NLS-1$
-        
-        Command command = helpParse(sql); 
-        ProcessorPlan plan = helpGetPlan(command, metadata, capFinder); 
-        
-        List[] expected = new List[] {   
-            Arrays.asList(new Object[] { new Integer(1) }), 
-        }; 
-        
-        helpProcess(plan, dataManager, expected);
-        
-        BatchedUpdateCommand buc = (BatchedUpdateCommand)dataManager.getCommandHistory().iterator().next();
-        Insert insert = (Insert)buc.getUpdateCommands().get(0);
-                
-        Constant value0 = (Constant)insert.getValues().get(0);
-        Constant value1 = (Constant)insert.getValues().get(1);
-        
-        assertEquals(DataTypeManager.DefaultDataClasses.BIG_INTEGER, value0.getValue().getClass());
-        assertEquals(DataTypeManager.DefaultDataClasses.FLOAT, value1.getValue().getClass());
-    }
-    
-    
-    public void testSelectInto_Case5569a_BATCH_NO_BULK_NO() {
-        boolean doBatching  = false;
-        boolean doBulkInsert = false;
-        helpSelectInto_Case5569Processor( doBatching, doBulkInsert );
-    }    
-    
-    public void testSelectInto_Case5569b_BATCH_YES_BULK_NO() {
-        boolean doBatching  = true;
-        boolean doBulkInsert = false;
-        helpSelectInto_Case5569Processor( doBatching, doBulkInsert );
-    }
-    
-    public void testSelectInto_Case5569c_BATCH_NO_BULK_YES() {
-        boolean doBatching  = false;
-        boolean doBulkInsert = true;
-        helpSelectInto_Case5569Processor( doBatching, doBulkInsert );
-    }
-
-    public void helpSelectInto_Case5569Processor( boolean doBatching, boolean doBulkInsert ) {
-        
-        FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder(); 
-        BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities(); 
- 
-        caps.setCapabilitySupport(Capability.BATCHED_UPDATES, doBatching); 
-        caps.setCapabilitySupport(Capability.BULK_INSERT, doBulkInsert); 
-        caps.setCapabilitySupport(Capability.QUERY_FROM_GROUP_ALIAS, false);
-
-        capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$ 
-
-        FakeMetadataFacade metadata = FakeMetadataFactory.example1();
-        
-        HardcodedDataManager dataManager = new HardcodedDataManager();
-
-        dataManager.addData("SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1",  //$NON-NLS-1$ 
-                            new List[] { Arrays.asList(new Object[] { "1", new Integer(1), Boolean.FALSE, new Double(1)}),     //$NON-NLS-1$
-                                         Arrays.asList(new Object[] { "2", new Integer(2), Boolean.TRUE, new Double(2) })});    //$NON-NLS-1$
-        
-        if (doBulkInsert) {
-            dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES (?,?,?,?)",  //$NON-NLS-1$ 
-                                new List[] { Arrays.asList(new Object[] { new Integer(2)})});             
-        } 
-        else 
-        if (doBatching) {
-            dataManager.addData("BatchedUpdate{I,I}",  //$NON-NLS-1$ 
-                                new List[] { Arrays.asList(new Object[] { new Integer(2)})});             
-        } else {
-            dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)",  //$NON-NLS-1$ 
-                                new List[] { Arrays.asList(new Object[] { new Integer(1)})});
-            dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)",  //$NON-NLS-1$ 
-                                new List[] { Arrays.asList(new Object[] { new Integer(1)})});             
-        }
-
-        String sql = "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 INTO pm1.g2 from pm1.g1"; //$NON-NLS-1$
-        
-        Command command = helpParse(sql); 
-
-        ProcessorPlan plan = helpGetPlan(command, metadata, capFinder); 
-        
-        List[] expected = new List[] {   
-            Arrays.asList(new Object[] { new Integer(2) }), 
-        }; 
-        
-        helpProcess(plan, dataManager, expected);
-        
-        // if not doBulkInsert and is doBatching,
-        //    check the command hist to ensure it contains the expected commands
-        if ( !doBulkInsert && doBatching ) {
-            BatchedUpdateCommand bu = (BatchedUpdateCommand)new ArrayList(dataManager.getCommandHistory()).get(1);
-            assertEquals(2, bu.getUpdateCommands().size());
-            assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)", bu.getUpdateCommands().get(0).toString() );  //$NON-NLS-1$
-            assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)", bu.getUpdateCommands().get(1).toString() );  //$NON-NLS-1$ 
-        }        
-    }
-    
-
-    public void testSelectInto_Case5412a() {
-        
-        // test setting BULK_INSERT capability to true
-        FakeMetadataObject pm1 = FakeMetadataFactory.createPhysicalModel("pm1"); //$NON-NLS-1$
-        FakeMetadataObject pm1g1 = FakeMetadataFactory.createPhysicalGroup("pm1.g1", pm1); //$NON-NLS-1$
-        
-        FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder(); 
-        BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities(); 
- 
-        caps.setCapabilitySupport(Capability.BULK_INSERT, true); 
-        capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$ 
-
-        List pm1g1e = FakeMetadataFactory.createElements(pm1g1, 
-                                    new String[] { "e1", "e2" }, //$NON-NLS-1$ //$NON-NLS-2$ 
-                                    new String[] { DataTypeManager.DefaultDataTypes.BIG_INTEGER, DataTypeManager.DefaultDataTypes.FLOAT});
-                                
-        FakeMetadataStore store = new FakeMetadataStore();
-        store.addObject(pm1);
-        store.addObject(pm1g1);     
-        store.addObjects(pm1g1e);
-        
-        FakeMetadataFacade metadata = new FakeMetadataFacade(store);
-        
-        HardcodedDataManager dataManager = new HardcodedDataManager();
-        dataManager.addData("INSERT INTO pm1.g1 (pm1.g1.e1, pm1.g1.e2) VALUES (?,?)",  //$NON-NLS-1$ 
-                            new List[] { Arrays.asList(new Object[] { new Integer(1) })}); 
-        
-        String sql = "SELECT 1, 1 INTO pm1.g1"; //$NON-NLS-1$
-        
-        Command command = helpParse(sql); 
-        ProcessorPlan plan = helpGetPlan(command, metadata, capFinder); 
-        
-        List[] expected = new List[] {   
-            Arrays.asList(new Object[] { new Integer(1) }), 
-        }; 
-        
-        helpProcess(plan, dataManager, expected);
-        
-        BulkInsert insert = (BulkInsert)dataManager.getCommandHistory().iterator().next();
-        List lst = (List)insert.getRows().get(0);
-        Object value0 = lst.get(0);
-        Object value1 = lst.get(1);
-        
-        assertEquals(DataTypeManager.DefaultDataClasses.BIG_INTEGER, value0.getClass());
-        assertEquals(DataTypeManager.DefaultDataClasses.FLOAT, value1.getClass());
-    }
-
-    
-    public void testSelectInto_Case5412b() {
-        
-        // test setting BULK_INSERT capability to false
-        FakeMetadataObject pm1 = FakeMetadataFactory.createPhysicalModel("pm1"); //$NON-NLS-1$
-        FakeMetadataObject pm1g1 = FakeMetadataFactory.createPhysicalGroup("pm1.g1", pm1); //$NON-NLS-1$
-        
-        FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder(); 
-        BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities(); 
- 
-        caps.setCapabilitySupport(Capability.BULK_INSERT, false); 
-        capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$ 
-
-        List pm1g1e = FakeMetadataFactory.createElements(pm1g1, 
-                                    new String[] { "e1", "e2" }, //$NON-NLS-1$ //$NON-NLS-2$ 
-                                    new String[] { DataTypeManager.DefaultDataTypes.BIG_INTEGER, DataTypeManager.DefaultDataTypes.FLOAT});
-                                
-        FakeMetadataStore store = new FakeMetadataStore();
-        store.addObject(pm1);
-        store.addObject(pm1g1);     
-        store.addObjects(pm1g1e);
-        
-        FakeMetadataFacade metadata = new FakeMetadataFacade(store);
-        
-        HardcodedDataManager dataManager = new HardcodedDataManager();
-        dataManager.addData("INSERT INTO pm1.g1 (pm1.g1.e1, pm1.g1.e2) VALUES (1, 1.0)",  //$NON-NLS-1$ 
-                            new List[] { Arrays.asList(new Object[] { new Integer(1) })}); 
-        
-        String sql = "SELECT 1, 1 INTO pm1.g1"; //$NON-NLS-1$
-        
-        Command command = helpParse(sql); 
-        ProcessorPlan plan = helpGetPlan(command, metadata, capFinder); 
-        
-        List[] expected = new List[] {   
-            Arrays.asList(new Object[] { new Integer(1) }), 
-        }; 
-        
-        helpProcess(plan, dataManager, expected);
-        
-        Insert insert = (Insert)dataManager.getCommandHistory().iterator().next();
-        
-        Constant value0 = (Constant)insert.getValues().get(0);
-        Constant value1 = (Constant)insert.getValues().get(1);
-        
-        assertEquals(DataTypeManager.DefaultDataClasses.BIG_INTEGER, value0.getValue().getClass());
-        assertEquals(DataTypeManager.DefaultDataClasses.FLOAT, value1.getValue().getClass());
-    }
-    
     private void sampleDataBQT2a(FakeDataManager dataMgr) throws QueryMetadataException, MetaMatrixComponentException {
         FakeMetadataFacade metadata = FakeMetadataFactory.exampleBQT();
     
@@ -7754,160 +7537,8 @@
         TestOptimizer.checkDependentJoinCount(plan, 1);
         // Run query
         helpProcess(plan, dataManager, expected);
-    }
-           
-    public void testInsertIntoWithSubquery_BATCH_NO_BULK_NO() {
-        boolean doBatching  = false;
-        boolean doBulkInsert = false;
-        helpInsertIntoWithSubquery( doBatching, doBulkInsert );
-    }    
+    }           
     
-    public void testInsertIntoWithSubquery_BATCH_YES_BULK_NO() {
-        boolean doBatching  = true;
-        boolean doBulkInsert = false;
-        helpInsertIntoWithSubquery( doBatching, doBulkInsert );
-    }
-    
-    public void testInsertIntoWithSubquery_BATCH_NO_BULK_YES() {
-        boolean doBatching  = false;
-        boolean doBulkInsert = true;
-        helpInsertIntoWithSubquery( doBatching, doBulkInsert );
-    }
-
-
-    public void helpInsertIntoWithSubquery( boolean doBatching, boolean doBulkInsert ) {
-        
-        FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder(); 
-        BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities(); 
- 
-        caps.setCapabilitySupport(Capability.BATCHED_UPDATES, doBatching); 
-        caps.setCapabilitySupport(Capability.BULK_INSERT, doBulkInsert);
-        caps.setCapabilitySupport(Capability.QUERY_FROM_GROUP_ALIAS, false);
-
-        capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$ 
-
-        FakeMetadataFacade metadata = FakeMetadataFactory.example1();
-        
-        HardcodedDataManager dataManager = new HardcodedDataManager();
-
-        dataManager.addData("SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1",  //$NON-NLS-1$ 
-                            new List[] { Arrays.asList(new Object[] { "1", new Integer(1), Boolean.FALSE, new Double(1)}),     //$NON-NLS-1$
-                                         Arrays.asList(new Object[] { "2", new Integer(2), Boolean.TRUE, new Double(2) })});    //$NON-NLS-1$
-        
-        if (doBulkInsert) {
-            dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES (?,?,?,?)",  //$NON-NLS-1$ 
-                                new List[] { Arrays.asList(new Object[] { new Integer(2)})});             
-        } 
-        else 
-        if (doBatching) {
-            dataManager.addData("BatchedUpdate{I,I}",  //$NON-NLS-1$ 
-                                new List[] { Arrays.asList(new Object[] { new Integer(2)})});             
-        } else {
-            dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)",  //$NON-NLS-1$ 
-                                new List[] { Arrays.asList(new Object[] { new Integer(1)})});
-            dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)",  //$NON-NLS-1$ 
-                                new List[] { Arrays.asList(new Object[] { new Integer(1)})});             
-        }
-
-        String sql = "INSERT INTO pm1.g2 SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 from pm1.g1"; //$NON-NLS-1$
-//        String sql = "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 INTO pm1.g2 from pm1.g1"; //$NON-NLS-1$
-        
-        Command command = helpParse(sql); 
-
-        ProcessorPlan plan = helpGetPlan(command, metadata, capFinder); 
-        
-        List[] expected = new List[] {   
-            Arrays.asList(new Object[] { new Integer(2) }), 
-        }; 
-        
-        helpProcess(plan, dataManager, expected);
-        
-        // if not doBulkInsert and is doBatching,
-        //    check the command hist to ensure it contains the expected commands
-        if ( !doBulkInsert && doBatching ) {
-            BatchedUpdateCommand bu = (BatchedUpdateCommand)new ArrayList(dataManager.getCommandHistory()).get(1);
-            assertEquals(2, bu.getUpdateCommands().size());
-            assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)", bu.getUpdateCommands().get(0).toString() );  //$NON-NLS-1$
-            assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)", bu.getUpdateCommands().get(1).toString() );  //$NON-NLS-1$ 
-        }        
-    }
-    
-    public void testInsertIntoWithSubquery2_BATCH_NO_BULK_NO() {
-        boolean doBatching  = false;
-        boolean doBulkInsert = false;
-        helpInsertIntoWithSubquery2( doBatching, doBulkInsert );
-    }    
-    
-    public void testInsertIntoWithSubquery2_BATCH_YES_BULK_NO() {
-        boolean doBatching  = true;
-        boolean doBulkInsert = false;
-        helpInsertIntoWithSubquery2( doBatching, doBulkInsert );
-    }
-    
-    public void testInsertIntoWithSubquery2_BATCH_NO_BULK_YES() {
-        boolean doBatching  = false;
-        boolean doBulkInsert = true;
-        helpInsertIntoWithSubquery2( doBatching, doBulkInsert );
-    }
-
-
-    public void helpInsertIntoWithSubquery2( boolean doBatching, boolean doBulkInsert ) {
-        
-        FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder(); 
-        BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities(); 
- 
-        caps.setCapabilitySupport(Capability.BATCHED_UPDATES, doBatching); 
-        caps.setCapabilitySupport(Capability.BULK_INSERT, doBulkInsert); 
-        caps.setCapabilitySupport(Capability.QUERY_FROM_GROUP_ALIAS, false);
-
-        capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$ 
-
-        FakeMetadataFacade metadata = FakeMetadataFactory.example1();
-        
-        HardcodedDataManager dataManager = new HardcodedDataManager();
-
-        dataManager.addData("SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 FROM pm1.g1",  //$NON-NLS-1$ 
-                            new List[] { Arrays.asList(new Object[] { "1", new Integer(1), Boolean.FALSE, new Double(1)}),     //$NON-NLS-1$
-                                         Arrays.asList(new Object[] { "2", new Integer(2), Boolean.TRUE, new Double(2) })});    //$NON-NLS-1$
-        
-        if (doBulkInsert) {
-            dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES (?,?,?,?)",  //$NON-NLS-1$ 
-                                new List[] { Arrays.asList(new Object[] { new Integer(2)})});             
-        } 
-        else 
-        if (doBatching) {
-            dataManager.addData("BatchedUpdate{I,I}",  //$NON-NLS-1$ 
-                                new List[] { Arrays.asList(new Object[] { new Integer(2)})});             
-        } else {
-            dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)",  //$NON-NLS-1$ 
-                                new List[] { Arrays.asList(new Object[] { new Integer(1)})});
-            dataManager.addData("INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)",  //$NON-NLS-1$ 
-                                new List[] { Arrays.asList(new Object[] { new Integer(1)})});             
-        }
-
-        String sql = "INSERT INTO pm1.g2 SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 from pm1.g1 UNION ALL SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 from pm1.g1"; //$NON-NLS-1$
-//        String sql = "SELECT pm1.g1.e1, pm1.g1.e2, pm1.g1.e3, pm1.g1.e4 INTO pm1.g2 from pm1.g1"; //$NON-NLS-1$
-        
-        Command command = helpParse(sql); 
-
-        ProcessorPlan plan = helpGetPlan(command, metadata, capFinder); 
-        
-        List[] expected = new List[] {   
-            Arrays.asList(new Object[] { new Integer(4) }), 
-        }; 
-        
-        helpProcess(plan, dataManager, expected);
-        
-        // if not doBulkInsert and is doBatching,
-        //    check the command hist to ensure it contains the expected commands
-        if ( !doBulkInsert && doBatching ) {
-            BatchedUpdateCommand bu = (BatchedUpdateCommand)new ArrayList(dataManager.getCommandHistory()).get(2);
-            assertEquals(2, bu.getUpdateCommands().size());
-            assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('1', 1, FALSE, 1.0)", bu.getUpdateCommands().get(0).toString() );  //$NON-NLS-1$
-            assertEquals( "INSERT INTO pm1.g2 (pm1.g2.e1, pm1.g2.e2, pm1.g2.e3, pm1.g2.e4) VALUES ('2', 2, TRUE, 2.0)", bu.getUpdateCommands().get(1).toString() );  //$NON-NLS-1$ 
-        }        
-    }
-    
     /**
      * A control test to ensure that y will still exist for sorting
      */

Modified: trunk/engine/src/test/java/com/metamatrix/query/processor/relational/TestProjectIntoNode.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/processor/relational/TestProjectIntoNode.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/test/java/com/metamatrix/query/processor/relational/TestProjectIntoNode.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -37,12 +37,12 @@
 import com.metamatrix.query.processor.ProcessorDataManager;
 import com.metamatrix.query.processor.FakeTupleSource.FakeComponentException;
 import com.metamatrix.query.sql.lang.BatchedUpdateCommand;
-import com.metamatrix.query.sql.lang.BulkInsert;
 import com.metamatrix.query.sql.lang.Command;
 import com.metamatrix.query.sql.lang.Insert;
 import com.metamatrix.query.sql.symbol.Constant;
 import com.metamatrix.query.sql.symbol.ElementSymbol;
 import com.metamatrix.query.sql.symbol.GroupSymbol;
+import com.metamatrix.query.tempdata.TempTableStoreImpl;
 import com.metamatrix.query.util.CommandContext;
 
 
@@ -152,17 +152,19 @@
             int batchSize = 1;
             
             // ensure that we have the right kind of insert, and that the data for this row is valid
-            if (!(command instanceof BulkInsert) && (command instanceof Insert)) {
-                ensureValue((Insert)command, 2, callCount);
-            } else if ( command instanceof BulkInsert ){
-                BulkInsert bulkInsert = (BulkInsert)command;
-                List batch = bulkInsert.getRows();
-                batchSize = batch.size();
-                assertEquals("Unexpected batch on call " + callCount, expectedBatchSize, batchSize); //$NON-NLS-1$
-                
-                for (int i = 0; i < batchSize; i++) {
-                    ensureValue2((List)batch.get(i), 2, ((callCount-1) * batchSize) + i + 1);
-                }
+            if (command instanceof Insert) {
+            	Insert insert = (Insert)command;
+            	if (insert.isBulk()) {
+                    List batch = TempTableStoreImpl.getBulkRows(insert);
+                    batchSize = batch.size();
+                    assertEquals("Unexpected batch on call " + callCount, expectedBatchSize, batchSize); //$NON-NLS-1$
+                    
+                    for (int i = 0; i < batchSize; i++) {
+                        ensureValue2((List)batch.get(i), 2, ((callCount-1) * batchSize) + i + 1);
+                    }
+            	} else {
+            		ensureValue((Insert)command, 2, callCount);
+            	}
             } else if ( command instanceof BatchedUpdateCommand ){
                 BatchedUpdateCommand bu = (BatchedUpdateCommand)command;
                 List batch = bu.getSubCommands();

Deleted: trunk/engine/src/test/java/com/metamatrix/query/sql/lang/TestBulkInsert.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/sql/lang/TestBulkInsert.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/test/java/com/metamatrix/query/sql/lang/TestBulkInsert.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -1,59 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package com.metamatrix.query.sql.lang;
-
-import java.util.ArrayList;
-
-import junit.framework.TestCase;
-
-import com.metamatrix.query.sql.symbol.GroupSymbol;
-import com.metamatrix.query.unittest.FakeMetadataFacade;
-import com.metamatrix.query.unittest.FakeMetadataFactory;
-import com.metamatrix.query.unittest.FakeMetadataObject;
-import com.metamatrix.query.unittest.FakeMetadataStore;
-
-
-
-/** 
- * @since 4.3
- */
-public class TestBulkInsert extends TestCase{
-    public TestBulkInsert(String name) { 
-        super(name);
-    }   
-
-         
-    public void test1() throws Exception{
-        FakeMetadataObject pm1 = FakeMetadataFactory.createPhysicalModel("pm1"); //$NON-NLS-1$
-        FakeMetadataObject pm1g = FakeMetadataFactory.createPhysicalGroup("pm1.g", pm1); //$NON-NLS-1$
-        FakeMetadataStore store = new FakeMetadataStore();
-        store.addObject(pm1);
-        store.addObject(pm1g);
-        GroupSymbol g = new GroupSymbol("g");//$NON-NLS-1$
-        g.setMetadataID(pm1g);
-        
-        BulkInsert bulkInsert = new BulkInsert(g, new ArrayList());
-        assertEquals(2, bulkInsert.updatingModelCount(new FakeMetadataFacade(store)));
-    }
-
-}

Modified: trunk/engine/src/test/java/com/metamatrix/query/sql/symbol/TestConstant.java
===================================================================
--- trunk/engine/src/test/java/com/metamatrix/query/sql/symbol/TestConstant.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/test/java/com/metamatrix/query/sql/symbol/TestConstant.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -157,72 +157,4 @@
         }
 	}
     
-    public void testCompareToString1() {
-        Constant a = new Constant(new String("a")); //$NON-NLS-1$
-        Constant b = new Constant(new String("b")); //$NON-NLS-1$
-        int compare = a.compareTo(b);
-        assertTrue("The String Values for these constants were incorrectly compared.", compare < 0); //$NON-NLS-1$
-    }
-
-    public void testCompareToString2() {
-        Constant a = new Constant(new String("a")); //$NON-NLS-1$
-        Constant b = new Constant(new String("a")); //$NON-NLS-1$
-        int compare = a.compareTo(b);
-        assertTrue("The String Values for these constants were incorrectly compared.", compare == 0); //$NON-NLS-1$
-    }
-
-    public void testCompareToString3() {
-        Constant a = new Constant(new String("b")); //$NON-NLS-1$
-        Constant b = new Constant(new String("a")); //$NON-NLS-1$
-        int compare = a.compareTo(b);
-        assertTrue("The String Values for these constants were incorrectly compared.", compare > 0); //$NON-NLS-1$
-    }
-    
-    public void testCompareToInt1() {
-        Constant a = new Constant(new Integer(1)); 
-        Constant b = new Constant(new Integer(2)); 
-        int compare = a.compareTo(b);
-        assertTrue("The String Values for these constants were incorrectly compared.", compare < 0); //$NON-NLS-1$
-
-    }
-
-    public void testCompareToInt2() {
-        Constant a = new Constant(new Integer(2)); 
-        Constant b = new Constant(new Integer(2)); 
-        int compare = a.compareTo(b);
-        assertTrue("The String Values for these constants were incorrectly compared.", compare == 0); //$NON-NLS-1$
-
-    }
-
-    public void testCompareToInt3() {
-        Constant a = new Constant(new Integer(2)); 
-        Constant b = new Constant(new Integer(1)); 
-        int compare = a.compareTo(b);
-        assertTrue("The String Values for these constants were incorrectly compared.", compare > 0); //$NON-NLS-1$
-    }
-    
-    public void testCompareToDifferingTypes() {
-        Constant a = new Constant(new Integer(2)); 
-        Constant b = new Constant(null); 
-        try{
-            a.compareTo(b);
-        }catch(ClassCastException e) {
-            //do nothing this should happen
-        }        
-    }
-    
-    public void testCompareToNull1() {
-        Constant a = new Constant(null, Integer.class); 
-        Constant b = new Constant(new Integer(1)); 
-        int compare = a.compareTo(b);
-        assertTrue("The String Values for these constants were incorrectly compared.", compare < 0); //$NON-NLS-1$        
-    }
-    
-    public void testCompareToNull2() {
-        Constant a = new Constant(new Integer(1)); 
-        Constant b = new Constant(null, Integer.class); 
-        int compare = a.compareTo(b);
-        assertTrue("The String Values for these constants were incorrectly compared.", compare > 0); //$NON-NLS-1$        
-    }
-
 }

Deleted: trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestBulkInsertImpl.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestBulkInsertImpl.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestBulkInsertImpl.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -1,100 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership.  Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.dqp.internal.datamgr.language;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.teiid.connector.language.IElement;
-import org.teiid.dqp.internal.datamgr.language.BulkInsertImpl;
-
-import junit.framework.TestCase;
-
-import com.metamatrix.query.sql.lang.BulkInsert;
-import com.metamatrix.query.sql.symbol.GroupSymbol;
-
-/**
- * A Testcase for Bulk Insert, this is a simple extension of regular insert
- */
-public class TestBulkInsertImpl extends TestCase {
-
-    /**
-     * Constructor for TestBulkInsert.
-     * @param name
-     */
-    public TestBulkInsertImpl(String name) {
-        super(name);
-    }
-    
-    public static BulkInsert helpExample(String groupName) {
-        GroupSymbol group = TestGroupImpl.helpExample(groupName);
-        ArrayList elements = new ArrayList();
-        elements.add(TestElementImpl.helpExample(groupName, "e1")); //$NON-NLS-1$
-        elements.add(TestElementImpl.helpExample(groupName, "e2")); //$NON-NLS-1$
-        elements.add(TestElementImpl.helpExample(groupName, "e3")); //$NON-NLS-1$
-        elements.add(TestElementImpl.helpExample(groupName, "e4")); //$NON-NLS-1$
-        
-        ArrayList rows = new ArrayList();
-        for (int i =0; i < 4; i++) {
-	        ArrayList values = new ArrayList();
-	        values.add(TestLiteralImpl.helpExample(1));
-	        values.add(TestLiteralImpl.helpExample(2));
-	        values.add(TestLiteralImpl.helpExample(3));
-	        values.add(TestLiteralImpl.helpExample(4));
-	        rows.add(values);
-        }
-        
-        return new BulkInsert(group,elements,rows);
-    }
-    
-
-    public static BulkInsertImpl example(String groupName) throws Exception {
-        return (BulkInsertImpl)TstLanguageBridgeFactory.factory.translate(helpExample(groupName));
-        
-    }
-
-    public void testGetGroup() throws Exception {
-        assertNotNull(example("a.b").getGroup()); //$NON-NLS-1$
-    }
-
-    public void testGetElements() throws Exception {
-        BulkInsertImpl insert = example("a.b"); //$NON-NLS-1$
-        assertNotNull(insert.getElements());
-        assertEquals(4, insert.getElements().size());
-        for (Iterator i = insert.getElements().iterator(); i.hasNext();) {
-            assertTrue(i.next() instanceof IElement);
-        }
-    }
-
-    public void testGetRows() throws Exception {
-        BulkInsertImpl insert = example("a.b"); //$NON-NLS-1$
-        assertNotNull(insert.getRows());
-        assertEquals(4, insert.getRows().size());
-//        for (Iterator iterRow = insert.getRows().iterator(); iterRow.hasNext();) {
-//            List row = (List) iterRow.next();
-//            for (Iterator i = row.iterator(); i.hasNext();) {
-//                assertTrue(i.next() instanceof IExpression);
-//            }            
-//        }
-    }
-}

Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestInsertImpl.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestInsertImpl.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/datamgr/language/TestInsertImpl.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -27,6 +27,7 @@
 
 import org.teiid.connector.language.IElement;
 import org.teiid.connector.language.IExpression;
+import org.teiid.connector.language.IInsertExpressionValueSource;
 import org.teiid.dqp.internal.datamgr.language.InsertImpl;
 
 import com.metamatrix.query.sql.lang.Insert;
@@ -103,9 +104,9 @@
 
     public void testGetValues() throws Exception {
         InsertImpl insert = example("a.b"); //$NON-NLS-1$
-        assertNotNull(insert.getValues());
-        assertEquals(4, insert.getValues().size());
-        for (Iterator i = insert.getValues().iterator(); i.hasNext();) {
+        assertNotNull(insert.getValueSource());
+        assertEquals(4, ((IInsertExpressionValueSource)insert.getValueSource()).getValues().size());
+        for (Iterator i = ((IInsertExpressionValueSource)insert.getValueSource()).getValues().iterator(); i.hasNext();) {
             assertTrue(i.next() instanceof IExpression);
         }
     }
@@ -117,9 +118,9 @@
         for (Iterator i = insert.getElements().iterator(); i.hasNext();) {
             assertTrue(i.next() instanceof IElement);
         }
-        assertNotNull(insert.getValues());
-        assertEquals(1, insert.getValues().size());
-        for (Iterator i = insert.getValues().iterator(); i.hasNext();) {
+        assertNotNull(insert.getValueSource());
+        assertEquals(1, ((IInsertExpressionValueSource)insert.getValueSource()).getValues().size());
+        for (Iterator i = ((IInsertExpressionValueSource)insert.getValueSource()).getValues().iterator(); i.hasNext();) {
             assertTrue(i.next() instanceof IExpression);
         }
     }

Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestCallableStatement.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestCallableStatement.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestCallableStatement.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -39,7 +39,7 @@
 		String sql = "{? = call pm4.spTest9()}"; //$NON-NLS-1$
 
 		try {
-			TestPreparedStatement.helpTestProcessing(sql, Collections.EMPTY_LIST, null, FakeMetadataFactory.exampleBQTCached(), true);
+			TestPreparedStatement.helpTestProcessing(sql, Collections.EMPTY_LIST, null, new HardcodedDataManager(), FakeMetadataFactory.exampleBQTCached(), true);
 			fail();
 		} catch (QueryResolverException e) {
 			assertEquals("Required parameter 'PM4.SPTEST9.INKEY' has no value was set or is an invalid parameter.", e.getMessage()); //$NON-NLS-1$

Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -79,10 +79,6 @@
 		super(name);
 	}	        	    
 	
-	static void helpTestProcessing(String preparedSql, List values, List[] expected, QueryMetadataInterface metadata, boolean callableStatement) throws Exception {
-        helpTestProcessing(preparedSql, values, expected, (ProcessorDataManager)null, metadata, callableStatement);
-	}
-	
     static void helpTestProcessing(String preparedSql, List values, List[] expected, ProcessorDataManager dataManager, QueryMetadataInterface metadata, boolean callableStatement) throws Exception { 
     	helpTestProcessing(preparedSql, values, expected, dataManager, metadata, callableStatement, false);
     }
@@ -126,7 +122,7 @@
         PreparedStatementRequest plan = TestPreparedStatement.helpGetProcessorPlan(preparedSql, values, cFinder, metadata, pPlanCache, SESSION_ID, callableStatement, false);
 
         // Run query
-        TestProcessor.helpProcess(plan.processPlan, plan.context, dManager, expected);
+        TestProcessor.doProcess(plan.processPlan, dataManager, expected, plan.context);
         
         //test cached plan
     	plan = TestPreparedStatement.helpGetProcessorPlan(preparedSql, values, cFinder, metadata, pPlanCache, SESSION_ID, callableStatement, false);
@@ -135,7 +131,7 @@
         assertEquals("should reuse the plan", exHitCount, pPlanCache.hitCount); //$NON-NLS-1$
                 
         // Run query again
-        TestProcessor.helpProcess(plan.processPlan, plan.context, dManager, expected);
+        TestProcessor.doProcess(plan.processPlan, dataManager, expected, plan.context);
         
         //get the plan again with a new connection
         assertNotNull(TestPreparedStatement.helpGetProcessorPlan(preparedSql, values, cFinder, metadata, pPlanCache, 7, callableStatement, false));
@@ -162,8 +158,9 @@
     
 		List values = new ArrayList();
 		values.add(new Short((short)0));
-        
-		helpTestProcessing(preparedSql, values, expected, FakeMetadataFactory.example1Cached(), false);
+		FakeDataManager dataManager = new FakeDataManager();
+        TestProcessor.sampleData1(dataManager);
+		helpTestProcessing(preparedSql, values, expected, dataManager, FakeMetadataFactory.example1Cached(), false);
 	}
     
     public void testSessionSpecificFunction() throws Exception { 

Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatementBatchedUpdate.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatementBatchedUpdate.java	2009-05-10 04:51:35 UTC (rev 902)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatementBatchedUpdate.java	2009-05-11 14:34:31 UTC (rev 903)
@@ -22,19 +22,23 @@
 
 package org.teiid.dqp.internal.process;
 
+import static org.junit.Assert.*;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
-import junit.framework.TestCase;
-
+import org.junit.Test;
 import org.teiid.dqp.internal.process.TestPreparedStatement.TestablePreparedPlanCache;
 
 import com.metamatrix.query.optimizer.capabilities.BasicSourceCapabilities;
 import com.metamatrix.query.optimizer.capabilities.FakeCapabilitiesFinder;
 import com.metamatrix.query.optimizer.capabilities.SourceCapabilities.Capability;
 import com.metamatrix.query.processor.FakeDataManager;
+import com.metamatrix.query.processor.HardcodedDataManager;
 import com.metamatrix.query.processor.TestProcessor;
+import com.metamatrix.query.sql.lang.Update;
+import com.metamatrix.query.sql.symbol.Constant;
 import com.metamatrix.query.unittest.FakeMetadataFactory;
 
 /**
@@ -42,12 +46,8 @@
  * plans that contain batched updates.
  *
  */
-public class TestPreparedStatementBatchedUpdate extends TestCase {
+public class TestPreparedStatementBatchedUpdate {
 
-	public TestPreparedStatementBatchedUpdate(String name) {
-		super(name);
-	}
-
     /**
      * Test prepared statements that use batched updates using the same prepared
      * command with varying number of commands in the batch.
@@ -80,7 +80,7 @@
      * 
      * @throws Exception
      */
-    public void testPlanCache_VarNumCmds() throws Exception {
+    @Test public void testPlanCache_VarNumCmds() throws Exception {
         // Create query 
 		String preparedSql = "UPDATE pm1.g1 SET pm1.g1.e1=?, pm1.g1.e3=? WHERE pm1.g1.e2=?"; //$NON-NLS-1$
         
@@ -152,10 +152,10 @@
      * 
      * @throws Exception
      */
-    public void testProcessor_VarNumCmds() throws Exception {
+    @Test public void testProcessor_VarNumCmds() throws Exception {
         // Create query 
 		String preparedSql = "UPDATE pm1.g1 SET pm1.g1.e1=?, pm1.g1.e3=? WHERE pm1.g1.e2=?"; //$NON-NLS-1$
-        
+        int executionsPerTest = 2;
 		// Create a testable prepared plan cache
 		TestablePreparedPlanCache prepPlanCache = new TestablePreparedPlanCache();
 		
@@ -167,11 +167,10 @@
         FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
         BasicSourceCapabilities caps = new BasicSourceCapabilities();
         caps.setCapabilitySupport(Capability.BATCHED_UPDATES, true);
-        caps.setCapabilitySupport(Capability.PREPARED_BATCH_UPDATE, false);
         capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
         
         // Something to hold our final query list
-        List<String> finalQueryList = new ArrayList<String>(42);
+        List<String> finalQueryList = new ArrayList<String>(13);
         
 		// Create expected results
         // first command should result in 2 rows affected
@@ -187,7 +186,7 @@
     	values.add(new ArrayList<Object>(Arrays.asList(new Object[] { null, Boolean.FALSE, new Integer(1) })));
     	
     	// Add our expected queries to the final query list
-    	for ( int i = 0; i < 6; i++ ) {
+    	for ( int i = 0; i < executionsPerTest; i++ ) {
     		finalQueryList.add(new String("UPDATE pm1.g1 SET e1 = 'a', e3 = FALSE WHERE pm1.g1.e2 = 0")); //$NON-NLS-1$
     		finalQueryList.add(new String("UPDATE pm1.g1 SET e1 = null, e3 = FALSE WHERE pm1.g1.e2 = 1")); //$NON-NLS-1$
     	}
@@ -207,7 +206,7 @@
 		values.add(new ArrayList<Object>(Arrays.asList(new Object[] { "a",  Boolean.FALSE, new Integer(0) })));  //$NON-NLS-1$
     	
     	// Add our expected queries to the final query list
-    	for (int i = 0; i < 6; i++) {
+    	for (int i = 0; i < executionsPerTest; i++) {
     		finalQueryList.add(new String("UPDATE pm1.g1 SET e1 = 'a', e3 = FALSE WHERE pm1.g1.e2 = 0")); //$NON-NLS-1$
     	}
     	
@@ -235,7 +234,7 @@
 		values.add(new ArrayList<Object>(Arrays.asList(new Object[] { "b",  Boolean.TRUE, new Integer(5)} )));  //$NON-NLS-1$
 
     	// Add our expected queries to the final query list
-    	for (int i = 0; i < 6; i++) {
+    	for (int i = 0; i < executionsPerTest; i++) {
     		finalQueryList.add(new String("UPDATE pm1.g1 SET e1 = 'a', e3 = FALSE WHERE pm1.g1.e2 = 0")); //$NON-NLS-1$
     		finalQueryList.add(new String("UPDATE pm1.g1 SET e1 = null, e3 = FALSE WHERE pm1.g1.e2 = 1")); //$NON-NLS-1$
     		finalQueryList.add(new String("UPDATE pm1.g1 SET e1 = 'c', e3 = TRUE WHERE pm1.g1.e2 = 4")); //$NON-NLS-1$
@@ -245,8 +244,38 @@
     	TestPreparedStatement.helpTestProcessing(preparedSql, values, expected, dataManager, capFinder, FakeMetadataFactory.example1Cached(), prepPlanCache, false, false, true);
 
     	// Verify all the queries that were run
-    	assertNotNull(dataManager);
     	assertEquals("Unexpected queries executed -", finalQueryList, dataManager.getQueries()); //$NON-NLS-1$
     }
-
+    
+    @Test public void testBatchedUpdatePushdown() throws Exception {
+        // Create query 
+		String preparedSql = "UPDATE pm1.g1 SET pm1.g1.e1=?, pm1.g1.e3=? WHERE pm1.g1.e2=?"; //$NON-NLS-1$
+        
+		// Create a testable prepared plan cache
+		TestablePreparedPlanCache prepPlanCache = new TestablePreparedPlanCache();
+		
+		// Construct data manager with data
+        HardcodedDataManager dataManager = new HardcodedDataManager();
+		dataManager.addData("UPDATE pm1.g1 SET e1 = ?, e3 = ? WHERE pm1.g1.e2 = ?", new List[] {Arrays.asList(4)}); //$NON-NLS-1$
+		// Source capabilities must support batched updates
+        FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+        BasicSourceCapabilities caps = new BasicSourceCapabilities();
+        caps.setCapabilitySupport(Capability.BULK_UPDATE, true);
+        capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+        
+        // batch with two commands
+		ArrayList<ArrayList<Object>> values = new ArrayList<ArrayList<Object>>(2);
+		values.add(new ArrayList<Object>(Arrays.asList(new Object[] { "a",  Boolean.FALSE, new Integer(0) })));  //$NON-NLS-1$
+    	values.add(new ArrayList<Object>(Arrays.asList(new Object[] { null, Boolean.FALSE, new Integer(1) })));
+    	
+    	List<?>[] expected = new List[] { 
+                Arrays.asList(4)
+        };
+    	
+    	// Create the plan and process the query
+    	TestPreparedStatement.helpTestProcessing(preparedSql, values, expected, dataManager, capFinder, FakeMetadataFactory.example1Cached(), prepPlanCache, false, false, false);
+    	Update update = (Update)dataManager.getCommandHistory().iterator().next();
+    	assertTrue(((Constant)update.getChangeList().getClauses().get(0).getValue()).isMultiValued());
+    }
+    
 }




More information about the teiid-commits mailing list