Index: src/main/java/org/teiid/query/util/Options.java
===================================================================
--- src/main/java/org/teiid/query/util/Options.java	(revision 4626)
+++ src/main/java/org/teiid/query/util/Options.java	(working copy)
@@ -37,6 +37,7 @@
 	private boolean subqueryUnnestDefault;
 	private boolean pushdownDefaultNullOrder = true;
 	private int joinPrefetchBatches = 10;
+	private boolean bestEffortFixed;
 	
 	public Properties getProperties() {
 		return properties;
@@ -84,4 +85,12 @@
 		this.joinPrefetchBatches = i;
 		return this;
 	}
+
+	public boolean isBestEffortFixed() {
+		return bestEffortFixed;
+	}
+	
+	public void setBestEffortFixed(boolean bestEffortFixed) {
+		this.bestEffortFixed = bestEffortFixed;
+	}
 }
Index: src/main/java/org/teiid/query/processor/relational/TextTableNode.java
===================================================================
--- src/main/java/org/teiid/query/processor/relational/TextTableNode.java	(revision 4626)
+++ src/main/java/org/teiid/query/processor/relational/TextTableNode.java	(working copy)
@@ -55,6 +55,8 @@
  */
 public class TextTableNode extends SubqueryAwareRelationalNode {
 
+	private boolean bestEffortFixed;
+	
 	private TextTable table;
 	
 	//initialized state
@@ -82,6 +84,7 @@
 	@Override
 	public void initialize(CommandContext context, BufferManager bufferManager,
 			ProcessorDataManager dataMgr) {
+		bestEffortFixed = context.getOptions().isBestEffortFixed();
 		super.initialize(context, bufferManager, dataMgr);
 		if (projectionIndexes != null) {
 			return;
@@ -215,7 +218,7 @@
 					}
 				}
 				if (table.isUsingRowDelimiter()) {
-				    if (exact && sb.length() < lineWidth) {
+				    if (exact && sb.length() < lineWidth && !bestEffortFixed) {
 				    	throw new TeiidProcessingException(QueryPlugin.Util.getString("TextTableNode.invalid_width", sb.length(), lineWidth, textLine, systemId)); //$NON-NLS-1$
 				    }
 					return sb.toString();
@@ -438,9 +441,13 @@
 		ArrayList<String> result = new ArrayList<String>();
 		int beginIndex = 0;
 		for (TextColumn col : table.getColumns()) {
-			String val = new String(line.substring(beginIndex, beginIndex + col.getWidth()));
-			addValue(result, col.isNoTrim(), val);
-			beginIndex += col.getWidth();
+			if (beginIndex >= line.length()) {
+				addValue(result, true, null);
+			} else {
+				String val = new String(line.substring(beginIndex, Math.min(line.length(), beginIndex + col.getWidth())));
+				addValue(result, col.isNoTrim(), val);
+				beginIndex += col.getWidth();
+			}
 		}
 		return result;
 	}
Index: src/test/java/org/teiid/query/processor/TestTextTable.java
===================================================================
--- src/test/java/org/teiid/query/processor/TestTextTable.java	(revision 4626)
+++ src/test/java/org/teiid/query/processor/TestTextTable.java	(working copy)
@@ -48,6 +48,7 @@
 import org.teiid.query.processor.relational.NestedTableJoinStrategy;
 import org.teiid.query.processor.relational.RelationalPlan;
 import org.teiid.query.unittest.RealMetadataFactory;
+import org.teiid.query.util.CommandContext;
 
 @SuppressWarnings({"unchecked", "nls"})
 public class TestTextTable {
@@ -249,6 +250,22 @@
         process(sql, expected);
     }
 	
+	@Test public void testTextTableFixedBestEffort() throws Exception {
+    	String sql = "select x.* from texttable('abc\nde\nfghi\n' COLUMNS x string width 1, y string width 1, z string width 1) x"; //$NON-NLS-1$
+    	
+        List[] expected = new List[] {
+        		Arrays.asList("a", "b", "c"),
+        		Arrays.asList("d", "e", null), //too short, but still parsed
+        		Arrays.asList("f", "g", "h"),  //truncated
+        };    
+
+        HardcodedDataManager dataManager = new HardcodedDataManager();
+        ProcessorPlan plan = helpGetPlan(helpParse(sql), RealMetadataFactory.example1Cached());
+        CommandContext cc = createCommandContext();
+        cc.getOptions().setBestEffortFixed(true);
+		helpProcess(plan, cc, dataManager, expected);
+    }
+	
 	@Test public void testTextTableGroupBy() throws Exception {
     	String sql = "select max(x) from texttable('a' || ',' || '1' COLUMNS x string, y integer) x group by y"; //$NON-NLS-1$
     	
