[teiid-commits] teiid SVN: r2397 - in trunk/engine/src: main/java/org/teiid/query/resolver/util and 5 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Mon Aug 2 12:14:27 EDT 2010


Author: shawkins
Date: 2010-08-02 12:14:26 -0400 (Mon, 02 Aug 2010)
New Revision: 2397

Modified:
   trunk/engine/src/main/java/org/teiid/query/resolver/command/InsertResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateResolver.java
   trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverVisitor.java
   trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/Insert.java
   trunk/engine/src/main/java/org/teiid/query/sql/lang/Update.java
   trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
   trunk/engine/src/main/resources/org/teiid/query/i18n.properties
   trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java
Log:
TEIID-1180 ensuring that input becomes inputs in an update procedure

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/InsertResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/InsertResolver.java	2010-08-02 15:33:33 UTC (rev 2396)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/InsertResolver.java	2010-08-02 16:14:26 UTC (rev 2397)
@@ -258,11 +258,9 @@
             
             String varName = varSymbol.getShortCanonicalName();
             String changingKey = ProcedureReservedWords.CHANGING + ElementSymbol.SEPARATOR + varName;
-            String inputKey = ProcedureReservedWords.INPUT + ElementSymbol.SEPARATOR + varName;
             String inputsKey = ProcedureReservedWords.INPUTS + ElementSymbol.SEPARATOR + varName;
             result.put(changingKey, new Constant(Boolean.TRUE));
             Object value = valIter.next();
-            result.put(inputKey, value);
             result.put(inputsKey, value);
         }
         
@@ -278,10 +276,8 @@
             
             String varName = varSymbol.getShortCanonicalName();
             String changingKey = ProcedureReservedWords.CHANGING + ElementSymbol.SEPARATOR + varName;
-            String inputKey = ProcedureReservedWords.INPUT + ElementSymbol.SEPARATOR + varName;
             String inputsKey = ProcedureReservedWords.INPUTS + ElementSymbol.SEPARATOR + varName;
             result.put(changingKey, new Constant(Boolean.FALSE));
-            result.put(inputKey, value);
             result.put(inputsKey, value);
         }
         

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateResolver.java	2010-08-02 15:33:33 UTC (rev 2396)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateResolver.java	2010-08-02 16:14:26 UTC (rev 2397)
@@ -102,10 +102,8 @@
             
             String varName = leftSymbol.getShortCanonicalName();
             String changingKey = ProcedureReservedWords.CHANGING + ElementSymbol.SEPARATOR + varName;
-            String inputKey = ProcedureReservedWords.INPUT + ElementSymbol.SEPARATOR + varName;
             String inputsKey = ProcedureReservedWords.INPUTS + ElementSymbol.SEPARATOR + varName;
             result.put(changingKey, new Constant(Boolean.TRUE));
-            result.put(inputKey, entry.getValue());
             result.put(inputsKey, entry.getValue());
             updateVars.add(leftSymbol);
         }

Modified: trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverVisitor.java	2010-08-02 15:33:33 UTC (rev 2396)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverVisitor.java	2010-08-02 16:14:26 UTC (rev 2397)
@@ -35,6 +35,7 @@
 import org.teiid.api.exception.query.QueryResolverException;
 import org.teiid.api.exception.query.UnresolvedSymbolDescription;
 import org.teiid.core.TeiidComponentException;
+import org.teiid.core.TeiidRuntimeException;
 import org.teiid.core.types.DataTypeManager;
 import org.teiid.core.types.DataTypeManager.DefaultDataClasses;
 import org.teiid.query.QueryPlugin;
@@ -208,18 +209,25 @@
         
         //copy the match information
         ElementSymbol resolvedSymbol = match.element;
+        GroupSymbol resolvedGroup = match.group;
+        String oldName = elementSymbol.getOutputName();
         if (isExternal //convert input to inputs
         		&& metadata.isScalarGroup(resolvedSymbol.getGroupSymbol().getMetadataID())
         		&& ProcedureReservedWords.INPUT.equals(groupContext)) {
         	resolvedSymbol = new ElementSymbol(ProcedureReservedWords.INPUTS + ElementSymbol.SEPARATOR + elementShortName);
         	resolveElementSymbol(resolvedSymbol);
-        	elementSymbol.setOutputName(resolvedSymbol.getOutputName());
+        	oldName = resolvedSymbol.getOutputName();
+        	resolvedGroup = new GroupSymbol(ProcedureReservedWords.INPUTS);
+        	try {
+				ResolverUtil.resolveGroup(resolvedGroup, metadata);
+			} catch (QueryResolverException e) {
+				throw new TeiidRuntimeException(e);
+			}
         } 
         elementSymbol.setIsExternalReference(isExternal);
         elementSymbol.setType(resolvedSymbol.getType());
         elementSymbol.setMetadataID(resolvedSymbol.getMetadataID());
-        elementSymbol.setGroupSymbol(match.group);
-        String oldName = elementSymbol.getOutputName();
+        elementSymbol.setGroupSymbol(resolvedGroup);
         elementSymbol.setName(resolvedSymbol.getName());
         elementSymbol.setOutputName(oldName);
    }

Modified: trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java	2010-08-02 15:33:33 UTC (rev 2396)
+++ trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java	2010-08-02 16:14:26 UTC (rev 2397)
@@ -1895,7 +1895,7 @@
                 Expression value = (Expression)variables.get(es.getCanonicalName());
 
                 if (value == null) {
-	                if ((grpName.equals(ProcedureReservedWords.INPUT) || grpName.equals(ProcedureReservedWords.INPUTS))) {
+	                if (grpName.equals(ProcedureReservedWords.INPUTS)) {
 	                	return new Constant(null, es.getType());
 	                } 
 	                if (grpName.equals(ProcedureReservedWords.CHANGING)) {
@@ -2460,7 +2460,7 @@
         Boolean result = null;
         for (ElementSymbol var : ElementCollectorVisitor.getElements(expr, false)) {
             String grpName = var.getGroupSymbol().getName();
-            if (var.isExternalReference() && (grpName.equalsIgnoreCase(ProcedureReservedWords.INPUT) || grpName.equalsIgnoreCase(ProcedureReservedWords.INPUTS))) {
+            if (var.isExternalReference() && grpName.equalsIgnoreCase(ProcedureReservedWords.INPUTS)) {
                 
                 String changingKey = ProcedureReservedWords.CHANGING + ElementSymbol.SEPARATOR + var.getShortCanonicalName();
                 

Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/Insert.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/Insert.java	2010-08-02 15:33:33 UTC (rev 2396)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/Insert.java	2010-08-02 16:14:26 UTC (rev 2397)
@@ -39,7 +39,6 @@
 import org.teiid.query.sql.symbol.Expression;
 import org.teiid.query.sql.symbol.GroupSymbol;
 import org.teiid.query.sql.symbol.SingleElementSymbol;
-import org.teiid.query.sql.util.ValueIterator;
 
 
 /**
@@ -242,8 +241,6 @@
         
         for (int j = 0; j < iSize; j++) {
             ElementSymbol symbol = (ElementSymbol)((ElementSymbol)variables.get( j )).clone();
-            symbol.setName(ProcedureReservedWords.INPUT + SingleElementSymbol.SEPARATOR + symbol.getShortCanonicalName());
-            map.put(symbol, values.get( j ) );
             symbol = (ElementSymbol)((ElementSymbol)variables.get( j )).clone();
             symbol.setName(ProcedureReservedWords.INPUTS + SingleElementSymbol.SEPARATOR + symbol.getShortCanonicalName());
             map.put(symbol, values.get( j ) );

Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/Update.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/Update.java	2010-08-02 15:33:33 UTC (rev 2396)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/Update.java	2010-08-02 16:14:26 UTC (rev 2397)
@@ -266,8 +266,6 @@
         for (Iterator iter = getChangeList().getClauses().iterator(); iter.hasNext();) {
         	SetClause setClause = (SetClause)iter.next();
             ElementSymbol symbol = (ElementSymbol)(setClause.getSymbol()).clone();
-            symbol.setName(ProcedureReservedWords.INPUT + SingleElementSymbol.SEPARATOR + symbol.getShortCanonicalName());
-            map.put( symbol, setClause.getValue() );
             symbol = (ElementSymbol)(setClause.getSymbol()).clone();
             symbol.setName(ProcedureReservedWords.INPUTS + SingleElementSymbol.SEPARATOR + symbol.getShortCanonicalName());
             map.put( symbol, setClause.getValue() );

Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java	2010-08-02 15:33:33 UTC (rev 2396)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java	2010-08-02 16:14:26 UTC (rev 2397)
@@ -365,9 +365,8 @@
 
     	String groupName = variable.getGroupSymbol().getCanonicalName();
 
-    	if(groupName.equals(ProcedureReservedWords.INPUT) ||
-			groupName.equals(ProcedureReservedWords.CHANGING) || groupName.equals(ProcedureReservedWords.INPUTS)) {
-			handleValidationError(QueryPlugin.Util.getString(ErrorMessageKeys.VALIDATOR_0012, new Object[] {ProcedureReservedWords.INPUT, ProcedureReservedWords.INPUTS, ProcedureReservedWords.CHANGING}), obj);
+    	if(groupName.equals(ProcedureReservedWords.CHANGING) || groupName.equals(ProcedureReservedWords.INPUTS)) {
+			handleValidationError(QueryPlugin.Util.getString(ErrorMessageKeys.VALIDATOR_0012, ProcedureReservedWords.INPUTS, ProcedureReservedWords.CHANGING), obj);
 		}
 
 		if(obj.hasCommand()) {

Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2010-08-02 15:33:33 UTC (rev 2396)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2010-08-02 16:14:26 UTC (rev 2397)
@@ -265,6 +265,7 @@
 ERR.015.012.0009 = The query defining an updatable virtual group cannot have more than one group in its FROM clause {0}
 ERR.015.012.0010 = The query defining an updatable simple virtual group should select all the required elements in its FROM clause {0}
 ERR.015.012.0011 = There must be exactly one projected symbol in the subcommand of an IN clause.
+ERR.015.012.0012 = An AssignmentStatement cannot change the value of a {0} or {1} variable.
 ERR.015.012.0013 = There must be exactly one projected symbol in the command of an AssignmentStatement.
 ERR.015.012.0014 = Variable used in the procedure''s AssignmentStatement does not match the type of value returned by the command.
 ERR.015.012.0016 = Variable {0} not assigned any value in this procedure.

Modified: trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java	2010-08-02 15:33:33 UTC (rev 2396)
+++ trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java	2010-08-02 16:14:26 UTC (rev 2397)
@@ -66,6 +66,7 @@
 import org.teiid.query.sql.lang.From;
 import org.teiid.query.sql.lang.Insert;
 import org.teiid.query.sql.lang.OrderBy;
+import org.teiid.query.sql.lang.ProcedureContainer;
 import org.teiid.query.sql.lang.Query;
 import org.teiid.query.sql.lang.SPParameter;
 import org.teiid.query.sql.lang.Select;
@@ -2220,6 +2221,24 @@
         assertNotNull("Input parameter does not have group", inElement.getGroupSymbol()); //$NON-NLS-1$
     }
     
+    @Test public void testInputToInputsConversion() throws Exception {
+        String procedure = "CREATE PROCEDURE  "; //$NON-NLS-1$
+        procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
+        procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
+        procedure = procedure + "ROWS_UPDATED = Select pm1.g1.e2 from pm1.g1 where e2=INPUTS.e2;\n"; //$NON-NLS-1$
+        procedure = procedure + "END\n"; //$NON-NLS-1$
+
+        String userUpdateStr = "UPDATE vm1.g1 SET e2=40"; //$NON-NLS-1$
+        
+        FakeMetadataFacade metadata = FakeMetadataFactory.exampleUpdateProc(FakeMetadataObject.Props.UPDATE_PROCEDURE, procedure);
+
+        ProcedureContainer userCommand = (ProcedureContainer)QueryParser.getQueryParser().parseCommand(userUpdateStr);
+        QueryResolver.resolveCommand(userCommand, metadata);
+        
+        Command command = QueryResolver.expandCommand(userCommand, metadata, AnalysisRecord.createNonRecordingRecord());
+        assertEquals("CREATE PROCEDURE\nBEGIN\nDECLARE integer var1;\nROWS_UPDATED = SELECT pm1.g1.e2 FROM pm1.g1 WHERE e2 = INPUTS.e2;\nEND", command.toString());
+    }
+    
     @Test public void testDefect16894_resolverException_1() {
         helpResolve("SELECT * FROM (SELECT * FROM Pm1.g1 AS Y) AS X"); //$NON-NLS-1$
     }
@@ -2232,28 +2251,11 @@
 		String sql = "select e1 as x ORDER BY x"; //$NON-NLS-1$      
 		helpResolveException(sql);
 	}
-
-// Not support XML query as subquery
-//    @Test public void testDefect17743() {
-//        CompareCriteria expected = new CompareCriteria();
-//        ElementSymbol es = new ElementSymbol("node1"); //$NON-NLS-1$
-//        GroupSymbol gs = new GroupSymbol("doc1"); //$NON-NLS-1$
-//        es.setGroupSymbol(gs);
-//        expected.setLeftExpression(es);
-//        expected.setOperator(CompareCriteria.EQ);
-//        ScalarSubquery subquery = new ScalarSubquery(helpResolve("select node1 from xmltest.doc1")); //$NON-NLS-1$
-//        expected.setRightExpression(subquery); //$NON-NLS-1$
-//        Query query = (Query) helpResolve("select * from xmltest.doc1 where node1 = (select node1 from xmltest.doc1)"); //$NON-NLS-1$
-//        Criteria actual = query.getCriteria();
-//        assertEquals("Did not match expected criteria", expected, actual);     //$NON-NLS-1$
-//    }
     
-    
     @Test public void testValidFullElementNotInQueryGroups() {
         helpResolveException("select pm1.g1.e1 FROM pm1.g1 g"); //$NON-NLS-1$
     }
     
-    
     @Test public void testUnionInSubquery() throws Exception {
         String sql = "SELECT StringKey FROM (SELECT BQT2.SmallB.StringKey FROM BQT2.SmallB union SELECT convert(BQT2.SmallB.FloatNum, string) FROM BQT2.SmallB) x";  //$NON-NLS-1$
         Command command = QueryParser.getQueryParser().parseCommand(sql);



More information about the teiid-commits mailing list