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

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Mon Aug 13 13:32:45 EDT 2012


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$
+    }
 	
 }



More information about the teiid-commits mailing list