Index: engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
===================================================================
--- engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java (revision 3658)
+++ engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java (working copy)
@@ -1469,7 +1469,7 @@
}
}
if (widthSet) {
- if (obj.getDelimiter() != null || obj.getHeader() != null || obj.getQuote() != null) {
+ if (obj.getDelimiter() != null || obj.getHeader() != null || obj.getQuote() != null || obj.getSelector() != null) {
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.text_table_width"), obj); //$NON-NLS-1$
}
} else {
Index: documentation/reference/src/main/docbook/en-US/content/grammar.xml
===================================================================
--- documentation/reference/src/main/docbook/en-US/content/grammar.xml (revision 3658)
+++ documentation/reference/src/main/docbook/en-US/content/grammar.xml (working copy)
@@ -24,8 +24,14 @@
+<IN_MULTI_LINE_COMMENT> MORE : {
+"/*" : {
+}
+
+
+
<IN_MULTI_LINE_COMMENT> SPECIAL : {
-<MULTI_LINE_COMMENT: "*/"> : DEFAULT
+"*/" : {
}
@@ -664,7 +670,7 @@
textTable
::=
-<ID> <LPAREN> expression nonReserved textColumn ( <COMMA> textColumn )* ( <NO> <ROW> nonReserved )? ( <ID> charVal )? ( ( <ESCAPE> charVal ) | ( <ID> charVal ) )? ( <ID> ( intVal )? )? ( <ID> intVal )? <RPAREN> ( <AS> )? id
+<ID> <LPAREN> expression nonReserved textColumn ( <COMMA> textColumn )* ( <NO> <ROW> nonReserved )? ( <ID> charVal )? ( ( <ESCAPE> charVal ) | ( <ID> charVal ) )? ( <ID> ( intVal )? )? ( <ID> intVal )? ( <ID> stringVal )? <RPAREN> ( <AS> )? id
textColumn
::=
@@ -844,7 +850,7 @@
function
::=
-( ( <CONVERT> <LPAREN> expression <COMMA> dataType <RPAREN> ) | ( <CAST> <LPAREN> expression <AS> dataType <RPAREN> ) | ( nonReserved <LPAREN> expression <FROM> expression ( <FOR> expression )? <RPAREN> ) | ( nonReserved <LPAREN> ( <YEAR> | <MONTH> | <DAY> | <HOUR> | <MINUTE> | <SECOND> ) <FROM> expression <RPAREN> ) | ( nonReserved <LPAREN> ( ( ( ( <LEADING> | <TRAILING> | <BOTH> ) ( expression )? ) | expression ) <FROM> )? expression <RPAREN> ) | ( nonReserved <LPAREN> expression <COMMA> stringConstant <RPAREN> ) | ( nonReserved <LPAREN> intervalType <COMMA> expression <COMMA> expression <RPAREN> ) | queryString | ( ( <LEFT> | <RIGHT> | <CHAR> | <USER> | <YEAR> | <MONTH> | <HOUR> | <MINUTE> | <SECOND> | <XMLCONCAT> | <XMLCOMMENT> ) <LPAREN> ( expressionList )? <RPAREN> ) | ( ( <TRANSLATE> | <INSERT> ) <LPAREN> ( expressionList )? <RPAREN> ) | xmlParse | xmlElement | ( <XMLPI> <LPAREN> ( <ID> idExpression | idExpression ) ( <COMMA> expression )? <RPAREN> ) | xmlForest | xmlSerialize | xmlQuery | ( id <LPAREN> ( expressionList )? <RPAREN> ) )
+( ( <CONVERT> <LPAREN> expression <COMMA> dataType <RPAREN> ) | ( <CAST> <LPAREN> expression <AS> dataType <RPAREN> ) | ( nonReserved <LPAREN> expression ( ( <FROM> expression ( <FOR> expression )? ) | ( <COMMA> expressionList ) ) <RPAREN> ) | ( nonReserved <LPAREN> ( <YEAR> | <MONTH> | <DAY> | <HOUR> | <MINUTE> | <SECOND> ) <FROM> expression <RPAREN> ) | ( nonReserved <LPAREN> ( ( ( ( <LEADING> | <TRAILING> | <BOTH> ) ( expression )? ) | expression ) <FROM> )? expression <RPAREN> ) | ( nonReserved <LPAREN> expression <COMMA> stringConstant <RPAREN> ) | ( nonReserved <LPAREN> intervalType <COMMA> expression <COMMA> expression <RPAREN> ) | queryString | ( ( <LEFT> | <RIGHT> | <CHAR> | <USER> | <YEAR> | <MONTH> | <HOUR> | <MINUTE> | <SECOND> | <XMLCONCAT> | <XMLCOMMENT> ) <LPAREN> ( expressionList )? <RPAREN> ) | ( ( <TRANSLATE> | <INSERT> ) <LPAREN> ( expressionList )? <RPAREN> ) | xmlParse | xmlElement | ( <XMLPI> <LPAREN> ( <ID> idExpression | idExpression ) ( <COMMA> expression )? <RPAREN> ) | xmlForest | xmlSerialize | xmlQuery | ( id <LPAREN> ( expressionList )? <RPAREN> ) )
stringConstant
::=
Index: api/src/main/java/org/teiid/language/SQLConstants.java
===================================================================
--- api/src/main/java/org/teiid/language/SQLConstants.java (revision 3658)
+++ api/src/main/java/org/teiid/language/SQLConstants.java (working copy)
@@ -73,6 +73,8 @@
public static final String HEADER = "HEADER"; //$NON-NLS-1$
public static final String QUOTE = "QUOTE"; //$NON-NLS-1$
public static final String COLUMNS = "COLUMNS"; //$NON-NLS-1$
+ public static final String SELECTOR = "SELECTOR"; //$NON-NLS-1$
+ public static final String SKIP = "SKIP"; //$NON-NLS-1$
//xmltable
public static final String ORDINALITY = "ORDINALITY"; //$NON-NLS-1$
public static final String PASSING = "PASSING"; //$NON-NLS-1$
@@ -113,7 +115,7 @@
public static final String ENABLED = "ENABLED"; //$NON-NLS-1$
public static final String DISABLED = "DISABLED"; //$NON-NLS-1$
- public static final String TRIM = "TRIM";
+ public static final String TRIM = "TRIM"; //$NON-NLS-1$
}
public interface Reserved {
Index: engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj (revision 3658)
+++ engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj (working copy)
@@ -2320,6 +2320,7 @@
Character quote = null;
Integer header = null;
Integer skip = null;
+ String selector = null;
String aliasID = null;
}
{
@@ -2366,6 +2367,10 @@
LOOKAHEAD(, { "skip".equalsIgnoreCase(getToken(1).image) })
skip = intVal()
]
+ [
+ LOOKAHEAD(, { "selector".equalsIgnoreCase(getToken(1).image) })
+ selector = stringVal()
+ ]
[] aliasID=id()
{
@@ -2379,6 +2384,7 @@
result.setName(validateAlias(aliasID));
result.setQuote(quote);
result.setUsingRowDelimiter(useRowDelimiter);
+ result.setSelector(selector);
return result;
}
}
Index: engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java
===================================================================
--- engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java (revision 3658)
+++ engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java (working copy)
@@ -170,6 +170,10 @@
break;
}
+ if (table.getSelector() != null && !line.startsWith(table.getSelector())) {
+ continue;
+ }
+
List vals = parseLine(line);
List