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);