Author: shawkins
Date: 2012-08-13 13:32:45 -0400 (Mon, 13 Aug 2012)
New Revision: 4312
Modified:
trunk/engine/src/main/java/org/teiid/query/metadata/MetadataValidator.java
trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java
trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
trunk/engine/src/main/java/org/teiid/query/validator/UpdateValidator.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/metadata/TestMetadataValidator.java
trunk/engine/src/test/java/org/teiid/query/processor/TestInsertProcessing.java
trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java
trunk/engine/src/test/java/org/teiid/query/validator/TestUpdateValidator.java
trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
Log:
TEIID-2144 better error messages from inherently updatable views
Modified: trunk/engine/src/main/java/org/teiid/query/metadata/MetadataValidator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/MetadataValidator.java 2012-08-13
17:22:35 UTC (rev 4311)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/MetadataValidator.java 2012-08-13
17:32:45 UTC (rev 4312)
@@ -27,11 +27,13 @@
import org.teiid.adminapi.impl.ModelMetaData;
import org.teiid.adminapi.impl.VDBMetaData;
+import org.teiid.adminapi.impl.ModelMetaData.Message.Severity;
import org.teiid.core.TeiidException;
import org.teiid.core.types.DataTypeManager;
import org.teiid.language.SQLConstants;
import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
import org.teiid.metadata.*;
import org.teiid.query.QueryPlugin;
import org.teiid.query.function.metadata.FunctionMetadataValidator;
@@ -179,13 +181,23 @@
}
}
}
-
+
public void log(ValidatorReport report, ModelMetaData model, String msg) {
- model.addRuntimeError(msg);
- LogManager.logWarning(LogConstants.CTX_QUERY_RESOLVER, msg);
- report.handleValidationError(msg);
+ log(report, model, Severity.ERROR, msg);
}
+ public void log(ValidatorReport report, ModelMetaData model, Severity severity, String
msg) {
+ model.addRuntimeMessage(severity, msg);
+ int messageLevel = MessageLevel.WARNING;
+ if (severity == Severity.ERROR) {
+ report.handleValidationError(msg);
+ } else {
+ messageLevel = MessageLevel.INFO;
+ report.handleValidationWarning(msg);
+ }
+ LogManager.log(messageLevel, LogConstants.CTX_QUERY_RESOLVER, msg);
+ }
+
private void validate(VDBMetaData vdb, ModelMetaData model, AbstractMetadataRecord
record, ValidatorReport report) {
QueryMetadataInterface metadata = vdb.getAttachment(QueryMetadataInterface.class);
metadata = new TempMetadataAdapter(metadata, new TempMetadataStore()); //TODO:
optimize this
@@ -224,9 +236,7 @@
}
if(resolverReport != null && resolverReport.hasItems()) {
for (ValidatorFailure v:resolverReport.getItems()) {
- if (v.getStatus() == ValidatorFailure.Status.ERROR) {
- log(report, model, v.getMessage());
- }
+ log(report, model, v.getStatus() ==
ValidatorFailure.Status.ERROR?Severity.ERROR:Severity.WARNING, v.getMessage());
}
}
} catch (TeiidException e) {
Modified:
trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java 2012-08-13
17:22:35 UTC (rev 4311)
+++
trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java 2012-08-13
17:32:45 UTC (rev 4312)
@@ -140,7 +140,7 @@
resolveProceduralCommand(procCommand, metadata);
- getPlan(metadata, procCommand);
+ //getPlan(metadata, procCommand);
}
private String getPlan(QueryMetadataInterface metadata, ProcedureContainer procCommand)
@@ -151,34 +151,45 @@
if (plan == null &&
!metadata.isProcedure(procCommand.getGroup().getMetadataID())) {
int type = procCommand.getType();
//force validation
- getUpdateInfo(procCommand.getGroup(), metadata, type);
+ getUpdateInfo(procCommand.getGroup(), metadata, type, true);
}
return plan;
}
return null;
}
- public static UpdateInfo getUpdateInfo(GroupSymbol group, QueryMetadataInterface
metadata, int type) throws QueryMetadataException, TeiidComponentException,
QueryResolverException {
+ public static UpdateInfo getUpdateInfo(GroupSymbol group, QueryMetadataInterface
metadata, int type, boolean validate) throws QueryMetadataException,
TeiidComponentException, QueryResolverException {
UpdateInfo info = getUpdateInfo(group, metadata);
if (info == null) {
return null;
}
-
- if ((info.isDeleteValidationError() && type == Command.TYPE_DELETE)
- || (info.isUpdateValidationError() && type == Command.TYPE_UPDATE)
- || (info.isInsertValidationError() && type == Command.TYPE_INSERT)) {
- String name = "Delete"; //$NON-NLS-1$
- if (type == Command.TYPE_UPDATE) {
- name = "Update"; //$NON-NLS-1$
- } else if (type == Command.TYPE_INSERT) {
- name = "Insert"; //$NON-NLS-1$
+ if (validate) {
+ String error = validateUpdateInfo(group, type, info);
+ if (error != null) {
+ throw new QueryResolverException(QueryPlugin.Event.TEIID30061, error);
}
- throw new QueryResolverException(QueryPlugin.Event.TEIID30061,
QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30061, group, name));
- }
+ }
return info;
}
+ public static String validateUpdateInfo(GroupSymbol group, int type,
+ UpdateInfo info) {
+ String error = info.getDeleteValidationError();
+ String name = "Delete"; //$NON-NLS-1$
+ if (type == Command.TYPE_UPDATE) {
+ error = info.getUpdateValidationError();
+ name = "Update"; //$NON-NLS-1$
+ } else if (type == Command.TYPE_INSERT) {
+ error = info.getInsertValidationError();
+ name = "Insert"; //$NON-NLS-1$
+ }
+ if (error != null) {
+ return QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30061, group, name, error);
+ }
+ return null;
+ }
+
public static UpdateInfo getUpdateInfo(GroupSymbol group,
QueryMetadataInterface metadata) throws TeiidComponentException,
QueryMetadataException, QueryResolverException {
@@ -204,7 +215,7 @@
// Resolve group so we can tell whether it is an update procedure
GroupSymbol group = procCommand.getGroup();
ResolverUtil.resolveGroup(group, metadata);
- procCommand.setUpdateInfo(ProcedureContainerResolver.getUpdateInfo(group,
metadata, procCommand.getType()));
+ procCommand.setUpdateInfo(ProcedureContainerResolver.getUpdateInfo(group,
metadata, procCommand.getType(), false));
}
public static GroupSymbol addScalarGroup(String name, TempMetadataStore metadata,
GroupContext externalGroups, List<? extends Expression> symbols) {
Modified: trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2012-08-13
17:22:35 UTC (rev 4311)
+++ trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2012-08-13
17:32:45 UTC (rev 4312)
@@ -2470,7 +2470,7 @@
}
insert.setVariables(mappedSymbols);
insert.setGroup(mapping.getGroup().clone());
- insert.setUpdateInfo(ProcedureContainerResolver.getUpdateInfo(insert.getGroup(),
metadata, Command.TYPE_INSERT));
+ insert.setUpdateInfo(ProcedureContainerResolver.getUpdateInfo(insert.getGroup(),
metadata, Command.TYPE_INSERT, true));
return rewriteInsert(insert);
}
@@ -2630,7 +2630,7 @@
update.setCriteria(Criteria.combineCriteria(update.getCriteria(),
(Criteria)info.getViewDefinition().getCriteria().clone()));
}
//resolve
- update.setUpdateInfo(ProcedureContainerResolver.getUpdateInfo(update.getGroup(),
metadata, Command.TYPE_UPDATE));
+ update.setUpdateInfo(ProcedureContainerResolver.getUpdateInfo(update.getGroup(),
metadata, Command.TYPE_UPDATE, true));
return rewriteUpdate(update);
}
Query query = (Query)info.getViewDefinition().clone();
@@ -2767,7 +2767,7 @@
delete.setGroup(mapping.getGroup().clone());
//TODO: properly handle correlated references
DeepPostOrderNavigator.doVisit(delete, new
ExpressionMappingVisitor(mapping.getUpdatableViewSymbols(), true));
- delete.setUpdateInfo(ProcedureContainerResolver.getUpdateInfo(delete.getGroup(),
metadata, Command.TYPE_DELETE));
+ delete.setUpdateInfo(ProcedureContainerResolver.getUpdateInfo(delete.getGroup(),
metadata, Command.TYPE_DELETE, true));
if (info.getViewDefinition().getCriteria() != null) {
delete.setCriteria(Criteria.combineCriteria(delete.getCriteria(),
(Criteria)info.getViewDefinition().getCriteria().clone()));
}
Modified: trunk/engine/src/main/java/org/teiid/query/validator/UpdateValidator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/UpdateValidator.java 2012-08-13
17:22:35 UTC (rev 4311)
+++ trunk/engine/src/main/java/org/teiid/query/validator/UpdateValidator.java 2012-08-13
17:32:45 UTC (rev 4312)
@@ -102,11 +102,11 @@
private boolean isSimple = true;
private UpdateMapping deleteTarget;
private UpdateType updateType;
- private boolean updateValidationError;
+ private String updateValidationError;
private UpdateType deleteType;
- private boolean deleteValidationError;
+ private String deleteValidationError;
private UpdateType insertType;
- private boolean insertValidationError;
+ private String insertValidationError;
private Query view;
private Map<ElementSymbol, List<Set<Constant>>> partitionInfo;
private List<UpdateInfo> unionBranches = new LinkedList<UpdateInfo>();
@@ -221,21 +221,39 @@
return view;
}
- public boolean isDeleteValidationError() {
+ public String getDeleteValidationError() {
return deleteValidationError;
}
- public boolean isInsertValidationError() {
+ public String getInsertValidationError() {
return insertValidationError;
}
- public boolean isUpdateValidationError() {
+ public String getUpdateValidationError() {
return updateValidationError;
}
public List<UpdateInfo> getUnionBranches() {
return unionBranches;
}
+
+ private void setUpdateValidationError(String updateValidationError) {
+ if (this.updateValidationError == null) {
+ this.updateValidationError = updateValidationError;
+ }
+ }
+
+ private void setInsertValidationError(String insertValidationError) {
+ if (this.insertValidationError == null) {
+ this.insertValidationError = insertValidationError;
+ }
+ }
+
+ private void setDeleteValidationError(String deleteValidationError) {
+ if (this.deleteValidationError == null) {
+ this.deleteValidationError = deleteValidationError;
+ }
+ }
}
@@ -277,20 +295,23 @@
private void handleValidationError(String error, boolean update, boolean insert, boolean
delete) {
if (update && insert && delete) {
report.handleValidationError(error);
+ updateInfo.setUpdateValidationError(error);
+ updateInfo.setInsertValidationError(error);
+ updateInfo.setDeleteValidationError(error);
} else {
if (update) {
updateReport.handleValidationError(error);
+ updateInfo.setUpdateValidationError(error);
}
if (insert) {
insertReport.handleValidationError(error);
+ updateInfo.setInsertValidationError(error);
}
if (delete) {
deleteReport.handleValidationError(error);
+ updateInfo.setDeleteValidationError(error);
}
}
- updateInfo.updateValidationError |= update;
- updateInfo.insertValidationError |= insert;
- updateInfo.deleteValidationError |= delete;
}
public void validate(Command command, List<ElementSymbol> viewSymbols) throws
QueryMetadataException, TeiidComponentException {
@@ -324,9 +345,15 @@
}
internalValidate(query, viewSymbols);
//accumulate the errors on the first branch - will be checked at resolve time
- ui.deleteValidationError |= this.updateInfo.deleteValidationError;
- ui.updateValidationError |= this.updateInfo.updateValidationError;
- ui.insertValidationError |= this.updateInfo.insertValidationError;
+ if (this.updateInfo.getDeleteValidationError() != null) {
+ ui.setDeleteValidationError(this.updateInfo.getDeleteValidationError());
+ }
+ if (this.updateInfo.getUpdateValidationError() != null) {
+ ui.setUpdateValidationError(this.updateInfo.getUpdateValidationError());
+ }
+ if (this.updateInfo.getInsertValidationError() != null) {
+ ui.setInsertValidationError(this.updateInfo.getInsertValidationError());
+ }
if (!first) {
ui.unionBranches.add(this.updateInfo);
this.updateInfo = ui;
@@ -339,12 +366,15 @@
internalValidate(command, viewSymbols);
if (this.updateInfo.deleteType != UpdateType.INHERENT) {
this.deleteReport.getItems().clear();
+ this.updateInfo.deleteValidationError = null;
}
if (this.updateInfo.updateType != UpdateType.INHERENT) {
this.updateReport.getItems().clear();
+ this.updateInfo.updateValidationError = null;
}
if (this.updateInfo.insertType != UpdateType.INHERENT) {
this.insertReport.getItems().clear();
+ this.updateInfo.insertValidationError = null;
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2012-08-13
17:22:35 UTC (rev 4311)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2012-08-13
17:32:45 UTC (rev 4312)
@@ -52,6 +52,7 @@
import org.teiid.query.function.source.XMLSystemFunctions;
import org.teiid.query.metadata.StoredProcedureInfo;
import org.teiid.query.metadata.SupportConstants;
+import org.teiid.query.resolver.ProcedureContainerResolver;
import org.teiid.query.resolver.QueryResolver;
import org.teiid.query.resolver.util.ResolverUtil;
import org.teiid.query.sql.LanguageObject;
@@ -137,6 +138,9 @@
validateNoXMLUpdates(obj);
GroupSymbol group = obj.getGroup();
validateGroupSupportsUpdate(group);
+ if (obj.getUpdateInfo() != null &&
obj.getUpdateInfo().isInherentDelete()) {
+ validateUpdate(obj, Command.TYPE_DELETE, obj.getUpdateInfo());
+ }
}
public void visit(GroupBy obj) {
@@ -172,6 +176,7 @@
validateMultisourceInsert(obj.getGroup());
}
if (obj.getUpdateInfo() != null &&
obj.getUpdateInfo().isInherentInsert()) {
+ validateUpdate(obj, Command.TYPE_INSERT, obj.getUpdateInfo());
try {
if (obj.getUpdateInfo().findInsertUpdateMapping(obj, false) == null) {
handleValidationError(QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30376,
obj.getVariables()), obj);
@@ -711,6 +716,7 @@
}
}
if (info != null && info.isInherentUpdate()) {
+ validateUpdate(update, Command.TYPE_UPDATE, info);
Set<ElementSymbol> updateCols =
update.getChangeList().getClauseMap().keySet();
if (!info.hasValidUpdateMapping(updateCols)) {
handleValidationError(QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30376,
updateCols), update);
@@ -722,6 +728,13 @@
validateSetClauseList(update.getChangeList());
}
+
+ private void validateUpdate(TargetedCommand update, int type, UpdateInfo info) {
+ String error = ProcedureContainerResolver.validateUpdateInfo(update.getGroup(), type,
info);
+ if (error != null) {
+ handleValidationError(error, update.getGroup());
+ }
+ }
/**
* Validates SELECT INTO queries.
Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2012-08-13 17:22:35
UTC (rev 4311)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2012-08-13 17:32:45
UTC (rev 4312)
@@ -81,7 +81,7 @@
# resolver (008)
TEIID30112=Only one XML document may be specified in the FROM clause of a query.
-TEIID30061={1} is not allowed on the view {0}: a procedure must be defined to handle the
{1}.
+TEIID30061={1} is not allowed on the view {0}. A procedure may be needed to handle the
{1} since: {2}
TEIID30127=INSERT statement must have the same number of elements and values specified.
This statement has {0} elements and {1} values.
TEIID30065=Error parsing query plan transformation for {0}
TEIID30136=Unable to resolve element: {0}
Modified: trunk/engine/src/test/java/org/teiid/query/metadata/TestMetadataValidator.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/metadata/TestMetadataValidator.java 2012-08-13
17:22:35 UTC (rev 4311)
+++
trunk/engine/src/test/java/org/teiid/query/metadata/TestMetadataValidator.java 2012-08-13
17:32:45 UTC (rev 4312)
@@ -56,7 +56,7 @@
this.vdb.addAttchment(TransformationMetadata.class, metadata);
}
- private static ModelMetaData buildModel(String modelName, boolean physical, VDBMetaData
vdb, MetadataStore store, String ddl) throws Exception {
+ public static ModelMetaData buildModel(String modelName, boolean physical, VDBMetaData
vdb, MetadataStore store, String ddl) throws Exception {
ModelMetaData model = new ModelMetaData();
model.setName(modelName);
model.setModelType(physical?Model.Type.PHYSICAL:Model.Type.VIRTUAL);
Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestInsertProcessing.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/processor/TestInsertProcessing.java 2012-08-13
17:22:35 UTC (rev 4311)
+++
trunk/engine/src/test/java/org/teiid/query/processor/TestInsertProcessing.java 2012-08-13
17:32:45 UTC (rev 4312)
@@ -3,16 +3,20 @@
import static org.junit.Assert.*;
import static org.teiid.query.processor.TestProcessor.*;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
+import org.teiid.adminapi.impl.VDBMetaData;
import org.teiid.core.types.DataTypeManager;
import org.teiid.metadata.MetadataStore;
import org.teiid.metadata.Schema;
import org.teiid.metadata.Table;
+import org.teiid.query.metadata.CompositeMetadataStore;
+import org.teiid.query.metadata.MetadataValidator;
import org.teiid.query.metadata.QueryMetadataInterface;
+import org.teiid.query.metadata.TestMetadataValidator;
+import org.teiid.query.metadata.TransformationMetadata;
import org.teiid.query.optimizer.TestOptimizer;
import org.teiid.query.optimizer.capabilities.BasicSourceCapabilities;
import org.teiid.query.optimizer.capabilities.DefaultCapabilitiesFinder;
@@ -54,7 +58,7 @@
Command command = helpParse(sql);
ProcessorPlan plan = helpGetPlan(command, metadata, capFinder);
- List[] expected = new List[] {
+ List<?>[] expected = new List[] {
Arrays.asList(new Object[] { new Integer(1) }),
};
@@ -70,7 +74,6 @@
assertEquals(DataTypeManager.DefaultDataClasses.FLOAT,
value1.getValue().getClass());
}
-
@Test public void testSelectInto_Case5569a_BATCH_NO_BULK_NO() {
boolean doBatching = false;
boolean doBulkInsert = false;
@@ -130,7 +133,7 @@
ProcessorPlan plan = helpGetPlan(command, metadata, capFinder);
- List[] expected = new List[] {
+ List<?>[] expected = new List[] {
Arrays.asList(new Object[] { new Integer(2) }),
};
@@ -139,7 +142,7 @@
// 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);
+ BatchedUpdateCommand bu =
(BatchedUpdateCommand)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$
@@ -174,7 +177,7 @@
Command command = helpParse(sql);
ProcessorPlan plan = helpGetPlan(command, metadata, capFinder);
- List[] expected = new List[] {
+ List<?>[] expected = new List[] {
Arrays.asList(new Object[] { new Integer(1) }),
};
@@ -208,7 +211,7 @@
Command command = helpParse(sql);
ProcessorPlan plan = helpGetPlan(command, metadata, capFinder);
- List[] expected = new List[] {
+ List<?>[] expected = new List[] {
Arrays.asList(new Object[] { new Integer(1) }),
};
@@ -285,7 +288,7 @@
ProcessorPlan plan = helpGetPlan(command, metadata, capFinder);
- List[] expected = new List[] {
+ List<?>[] expected = new List[] {
Arrays.asList(new Object[] { new Integer(2) }),
};
@@ -294,7 +297,7 @@
// 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);
+ BatchedUpdateCommand bu =
(BatchedUpdateCommand)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$
@@ -361,7 +364,7 @@
ProcessorPlan plan = helpGetPlan(command, metadata, capFinder);
- List[] expected = new List[] {
+ List<?>[] expected = new List[] {
Arrays.asList(new Object[] { new Integer(4) }),
};
@@ -380,7 +383,7 @@
@Test public void testInsertIntoVirtualWithQueryExpression() {
String sql = "insert into vm1.g1 (e1, e2, e3, e4) select * from
pm1.g1"; //$NON-NLS-1$
- List[] expected = new List[] {
+ List<?>[] expected = new List[] {
Arrays.asList(6),
};
@@ -429,5 +432,28 @@
dataManager.addData("INSERT INTO g1 (e1) SELECT g2.e1 FROM g2", expected);
helpProcess(plan, dataManager, expected);
}
+
+ @Test public void testAutoIncrementView() throws Exception {
+ VDBMetaData vdb = new VDBMetaData();
+ MetadataStore store = new MetadataStore();
+ String ddl = "create foreign table t1 (x integer options (auto_increment true),
y string) options (updatable true); \n"
+ + "create view v1 (x integer options (auto_increment true), y string) options
(updatable true) as select * from t1;";
+ TestMetadataValidator.buildModel("x", true, vdb, store, ddl);
+ TransformationMetadata tm = new TransformationMetadata(vdb, new
CompositeMetadataStore(Arrays.asList(store)), null,
RealMetadataFactory.SFM.getSystemFunctions(), null);
+ vdb.addAttchment(TransformationMetadata.class, tm);
+ vdb.addAttchment(QueryMetadataInterface.class, tm);
+ new MetadataValidator().validate(vdb, store);
+
+ String sql = "insert into v1 (y) values ('a')"; //$NON-NLS-1$
+
+ Command command = helpParse(sql);
+ ProcessorPlan plan = helpGetPlan(command, tm, new DefaultCapabilitiesFinder());
+
+ HardcodedDataManager dataManager = new HardcodedDataManager(tm);
+ List<?>[] expected = new List<?>[] {Arrays.asList(1)};
+ dataManager.addData("INSERT INTO t1 (y) VALUES ('a')", expected);
+ helpProcess(plan, dataManager, expected);
+ }
+
}
Modified: trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java 2012-08-13
17:22:35 UTC (rev 4311)
+++ trunk/engine/src/test/java/org/teiid/query/resolver/TestResolver.java 2012-08-13
17:32:45 UTC (rev 4312)
@@ -2416,24 +2416,6 @@
helpResolve(sql);
}
-
- @Test public void testUpdateError() {
- String userUpdateStr = "UPDATE vm1.g2 SET e1='x'";
//$NON-NLS-1$
-
- helpResolveException(userUpdateStr, metadata, "TEIID30061 Update is not
allowed on the view vm1.g2: a procedure must be defined to handle the Update.");
//$NON-NLS-1$
- }
-
- @Test public void testInsertError() {
- String userUpdateStr = "INSERT into vm1.g2 (e1) values ('x')";
//$NON-NLS-1$
-
- helpResolveException(userUpdateStr, metadata, "TEIID30061 Insert is not
allowed on the view vm1.g2: a procedure must be defined to handle the Insert.");
//$NON-NLS-1$
- }
-
- @Test public void testDeleteError() {
- String userUpdateStr = "DELETE from vm1.g2 where e1='x'";
//$NON-NLS-1$
-
- helpResolveException(userUpdateStr, metadata, "TEIID30061 Delete is not
allowed on the view vm1.g2: a procedure must be defined to handle the Delete.");
//$NON-NLS-1$
- }
@Test public void testResolveXMLSelect() {
String procedure = "CREATE VIRTUAL PROCEDURE "; //$NON-NLS-1$
Modified: trunk/engine/src/test/java/org/teiid/query/validator/TestUpdateValidator.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/validator/TestUpdateValidator.java 2012-08-13
17:22:35 UTC (rev 4311)
+++
trunk/engine/src/test/java/org/teiid/query/validator/TestUpdateValidator.java 2012-08-13
17:32:45 UTC (rev 4312)
@@ -72,9 +72,9 @@
ResolverUtil.resolveGroup(gs, md);
uv.validate(command, ResolverUtil.resolveElementsInGroup(gs, md));
UpdateInfo info = uv.getUpdateInfo();
- assertEquals(uv.getReport().getFailureMessage(), failInsert,
info.isInsertValidationError());
- assertEquals(uv.getReport().getFailureMessage(), failUpdate,
info.isUpdateValidationError());
- assertEquals(uv.getReport().getFailureMessage(), failDelete,
info.isDeleteValidationError());
+ assertEquals(uv.getReport().getFailureMessage(), failInsert,
info.getInsertValidationError() != null);
+ assertEquals(uv.getReport().getFailureMessage(), failUpdate,
info.getUpdateValidationError() != null);
+ assertEquals(uv.getReport().getFailureMessage(), failDelete,
info.getDeleteValidationError() != null);
return uv;
} catch (TeiidException e) {
throw new RuntimeException(e);
Modified: trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java 2012-08-13
17:22:35 UTC (rev 4311)
+++ trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java 2012-08-13
17:32:45 UTC (rev 4312)
@@ -1724,5 +1724,23 @@
@Test public void testInvalidCorrelation() {
helpValidate("SELECT XMLELEMENT(NAME metadata, XMLFOREST(e1 AS objectName),
(SELECT XMLAGG(XMLELEMENT(NAME subTypes, XMLFOREST(e1))) FROM pm1.g2 AS b WHERE b.e2 =
a.e2)) FROM pm1.g1 AS a GROUP BY e1", new String[] {"a.e2"},
RealMetadataFactory.example1Cached());
}
+
+ @Test public void testUpdateError() {
+ String userUpdateStr = "UPDATE vm1.g2 SET e1='x'";
//$NON-NLS-1$
+
+ helpValidate(userUpdateStr, new String[]{"vm1.g2", "UPDATE vm1.g2
SET e1 = 'x'"}, RealMetadataFactory.example1Cached()); //$NON-NLS-1$
+ }
+
+ @Test public void testInsertError() {
+ String userUpdateStr = "INSERT into vm1.g2 (e1) values ('x')";
//$NON-NLS-1$
+
+ helpValidate(userUpdateStr, new String[]{"vm1.g2", "INSERT INTO
vm1.g2 (e1) VALUES ('x')"}, RealMetadataFactory.example1Cached());
//$NON-NLS-1$
+ }
+
+ @Test public void testDeleteError() {
+ String userUpdateStr = "DELETE from vm1.g2 where e1='x'";
//$NON-NLS-1$
+
+ helpValidate(userUpdateStr, new String[]{"vm1.g2"},
RealMetadataFactory.example1Cached()); //$NON-NLS-1$
+ }
}