[teiid-commits] teiid SVN: r3377 - in trunk: documentation/reference/src/main/docbook/en-US/content and 10 other directories.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Thu Aug 11 14:49:54 EDT 2011
Author: shawkins
Date: 2011-08-11 14:49:54 -0400 (Thu, 11 Aug 2011)
New Revision: 3377
Modified:
trunk/build/kits/jboss-container/teiid-releasenotes.html
trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml
trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml
trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java
trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
trunk/engine/src/main/resources/org/teiid/query/i18n.properties
trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
trunk/engine/src/test/java/org/teiid/query/processor/TestTextTable.java
trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java
trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
Log:
TEIID-1703 adding more flexibility to fixed width parsing
Modified: trunk/build/kits/jboss-container/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-container/teiid-releasenotes.html 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/build/kits/jboss-container/teiid-releasenotes.html 2011-08-11 18:49:54 UTC (rev 3377)
@@ -28,6 +28,7 @@
<UL>
<LI><B>Procedure language features</B> - Added support for compound/block statements, BEGIN [[NOT] ATOMIC], loop/block labels, and the leave statement. See the reference for more.
<LI><B>File Enhancements</B> - the file translator can now optionally (via the ExceptionIfFileNotFound property) throw an exception if the path refers to a file that doesn't exist. The file resource adapter can be configured to map file names and can prevent parent path .. references. See the Admin Guide or the file-ds.xml template for more.
+ <LI><B>TEXTTABLE Enhancements</B> - TEXTTABLE can now parse fixed width files that do not use a row delimiter and can optionally produce fixed values that haven't been trimmed.
</UL>
<h2><a name="Compatibility">Compatibility Issues</a></h2>
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/grammar.xml 2011-08-11 18:49:54 UTC (rev 3377)
@@ -664,11 +664,11 @@
<row>
<entry align="right" valign="top"><para><anchor id="prod76" xreflabel="textTable"/>textTable</para></entry>
<entry align="left" valign="top"><para>::=
-<ID> <LPAREN> <link linkend="prod24">expression</link> <link linkend="prod11">nonReserved</link> <link linkend="prod82">textColumn</link> ( <COMMA> <link linkend="prod82">textColumn</link> )* ( <ID> <link linkend="prod68">charVal</link> )? ( ( <ESCAPE> <link linkend="prod68">charVal</link> ) | ( <ID> <link linkend="prod68">charVal</link> ) )? ( <ID> ( <link linkend="prod83">intVal</link> )? )? ( <ID> <link linkend="prod83">intVal</link> )? <RPAREN> ( <AS> )? <link linkend="prod2">id</link></para></entry></row>
+<ID> <LPAREN> <link linkend="prod24">expression</link> <link linkend="prod11">nonReserved</link> <link linkend="prod82">textColumn</link> ( <COMMA> <link linkend="prod82">textColumn</link> )* ( <NO> <ROW> <link linkend="prod11">nonReserved</link> )? ( <ID> <link linkend="prod68">charVal</link> )? ( ( <ESCAPE> <link linkend="prod68">charVal</link> ) | ( <ID> <link linkend="prod68">charVal</link> ) )? ( <ID> ( <link linkend="prod83">intVal</link> )? )? ( <ID> <link linkend="prod83">intVal</link> )? <RPAREN> ( <AS> )? <link linkend="prod2">id</link></para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor id="prod82" xreflabel="textColumn"/>textColumn</para></entry>
<entry align="left" valign="top"><para>::=
-<link linkend="prod2">id</link> <link linkend="prod37">dataType</link> ( <ID> <link linkend="prod83">intVal</link> )?</para></entry></row>
+<link linkend="prod2">id</link> <link linkend="prod37">dataType</link> ( <ID> <link linkend="prod83">intVal</link> ( <NO> <link linkend="prod11">nonReserved</link> )? )?</para></entry></row>
<row>
<entry align="right" valign="top"><para><anchor id="prod84" xreflabel="xmlQuery"/>xmlQuery</para></entry>
<entry align="left" valign="top"><para>::=
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/sql_clauses.xml 2011-08-11 18:49:54 UTC (rev 3377)
@@ -98,8 +98,8 @@
</para>
<para>
Usage:
- <synopsis label="Usage">TEXTTABLE(expression COLUMNS <COLUMN>, ... [DELIMITER char] [(QUOTE|ESCAPE) char] [HEADER [integer]] [SKIP integer]) AS name</synopsis>
- <synopsis label="Usage">COLUMN := name datatype [WIDTH integer]</synopsis>
+ <synopsis label="Usage">TEXTTABLE(expression COLUMNS <COLUMN>, ... [NO ROW DELIMITER] [DELIMITER char] [(QUOTE|ESCAPE) char] [HEADER [integer]] [SKIP integer]) AS name</synopsis>
+ <synopsis label="Usage">COLUMN := name datatype [WIDTH integer [NO TRIM]]</synopsis>
</para>
<itemizedlist>
<para>Parameters</para>
@@ -108,6 +108,10 @@
</para>
</listitem>
<listitem>
+ <para>NO ROW DELIMITER indicates that fixed parsing should not assume the presense of newline row delimiters.
+ </para>
+ </listitem>
+ <listitem>
<para>DELIMITER sets the field delimiter character to use. Defaults to ','.
</para>
</listitem>
@@ -131,12 +135,20 @@
<para>SKIP specifies the number of text lines (counting every new line) to skip before parsing the contents. HEADER may still be specified with SKP.
</para>
</listitem>
+ <listitem>
+ <para>WIDTH indicates the fixed-width length of a column in characters - not bytes. The CR NL newline value counts as a single character.
+ </para>
+ </listitem>
+ <listitem>
+ <para>NO TRIM specifies that the text value should not be trimmed of all leading and trailing white space.
+ </para>
+ </listitem>
</itemizedlist>
<itemizedlist>
<para>Syntax Rules:
</para>
<listitem>
- <para>If width is specified for one column it must be specified for all columns.
+ <para>If width is specified for one column it must be specified for all columns and be a non-negative integer.
</para>
</listitem>
<listitem>
@@ -144,6 +156,10 @@
</para>
</listitem>
<listitem>
+ <para>If width is not specified, then NO ROW DELIMITER cannot be used.
+ </para>
+ </listitem>
+ <listitem>
<para>The columns names must be not contain duplicates.
</para>
</listitem>
@@ -151,21 +167,25 @@
<itemizedlist>
<para>Examples</para>
<listitem>
- <para>Use of the HEADER parameter, returns 1 row ['b']: <programlisting>select * from texttable('col1,col2,col3\na,b,c' COLUMNS col2 string HEADER) x</programlisting>
+ <para>Use of the HEADER parameter, returns 1 row ['b']: <programlisting>SELECT * FROM TEXTTABLE(UNESCAPE('col1,col2,col3\na,b,c') COLUMNS col2 string HEADER) x</programlisting>
</para>
</listitem>
<listitem>
- <para>Use of fixed width, returns 1 row ['a', 'b', 'c']: <programlisting>select * from texttable('abc' COLUMNS col1 string width 1, col2 string width 1, col3 string width 1) x</programlisting>
+ <para>Use of fixed width, returns 2 rows ['a', 'b', 'c'], ['d', 'e', 'f']: <programlisting>SELECT * FROM TEXTTABLE(UNESCAPE('abc\ndef') COLUMNS col1 string width 1, col2 string width 1, col3 string width 1) x</programlisting>
</para>
</listitem>
<listitem>
- <para>Use of ESCAPE parameter, returns 1 row ['a,', 'b']: <programlisting>select * from texttable('a:,,b' COLUMNS col1 string, col2 string ESCAPE ':') x</programlisting>
+ <para>Use of fixed width without a row delimiter, returns 3 rows ['a'], ['b'], ['c']: <programlisting>SELECT * FROM TEXTTABLE('abc' COLUMNS col1 string width 1 NO ROW DELIMITER) x</programlisting>
</para>
</listitem>
<listitem>
- <para>As a nested table: <programlisting>select x.* from t, texttable(t.clobcolumn COLUMNS first string, second date SKIP 1) x</programlisting>
+ <para>Use of ESCAPE parameter, returns 1 row ['a,', 'b']: <programlisting>SELECT * FROM TEXTTABLE('a:,,b' COLUMNS col1 string, col2 string ESCAPE ':') x</programlisting>
</para>
</listitem>
+ <listitem>
+ <para>As a nested table: <programlisting>SELECT x.* FROM t, TEXTTABLE(t.clobcolumn COLUMNS first string, second date SKIP 1) x</programlisting>
+ </para>
+ </listitem>
</itemizedlist>
</section>
<section id="xmltable">
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java 2011-08-11 18:49:54 UTC (rev 3377)
@@ -51,9 +51,6 @@
/**
* Handles text file processing.
*
- * TODO: unix style escape handling \t \n, etc. - see also the unescape function
- * TODO: allow for escaping with fixed parsing
- * TODO: allow for fixed parsing without new lines
* TODO: allow for a configurable line terminator
*/
public class TextTableNode extends SubqueryAwareRelationalNode {
@@ -211,14 +208,21 @@
if (eof) {
return null;
}
- continue; //skip empty lines
+ if (table.isUsingRowDelimiter()) {
+ continue; //skip empty lines
+ }
}
- if (exact && sb.length() < lineWidth) {
- throw new TeiidProcessingException(QueryPlugin.Util.getString("TextTableNode.invalid_width", sb.length(), lineWidth, textLine, systemId)); //$NON-NLS-1$
- }
- return sb.toString();
+ if (table.isUsingRowDelimiter()) {
+ if (exact && sb.length() < lineWidth) {
+ throw new TeiidProcessingException(QueryPlugin.Util.getString("TextTableNode.invalid_width", sb.length(), lineWidth, textLine, systemId)); //$NON-NLS-1$
+ }
+ return sb.toString();
+ }
}
sb.append(c);
+ if (exact && sb.length() == maxLength && !table.isUsingRowDelimiter()) {
+ return sb.toString();
+ }
if (sb.length() > maxLength) {
if (exact) {
sb.deleteCharAt(sb.length() - 1);
@@ -433,7 +437,7 @@
int beginIndex = 0;
for (TextColumn col : table.getColumns()) {
String val = new String(line.substring(beginIndex, beginIndex + col.getWidth()));
- addValue(result, false, val);
+ addValue(result, col.isNoTrim(), val);
beginIndex += col.getWidth();
}
return result;
Modified: trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/main/java/org/teiid/query/sql/lang/TextTable.java 2011-08-11 18:49:54 UTC (rev 3377)
@@ -36,10 +36,12 @@
public static class TextColumn extends ProjectedColumn {
private Integer width;
+ private boolean noTrim;
- public TextColumn(String name, String type, Integer width) {
+ public TextColumn(String name, String type, Integer width, boolean noTrim) {
super(name, type);
this.width = width;
+ this.noTrim = noTrim;
}
protected TextColumn() {
@@ -54,6 +56,14 @@
this.width = width;
}
+ public boolean isNoTrim() {
+ return noTrim;
+ }
+
+ public void setNoTrim(boolean noTrim) {
+ this.noTrim = noTrim;
+ }
+
@Override
public boolean equals(Object obj) {
if (obj == this) {
@@ -63,13 +73,15 @@
return false;
}
TextColumn other = (TextColumn)obj;
- return EquivalenceUtil.areEqual(width, other.width);
+ return EquivalenceUtil.areEqual(width, other.width)
+ && noTrim == other.noTrim;
}
@Override
public TextColumn clone() {
TextColumn clone = new TextColumn();
clone.width = this.width;
+ clone.noTrim = this.noTrim;
this.copyTo(clone);
return clone;
}
@@ -82,6 +94,7 @@
private boolean escape;
private Integer header;
private Integer skip;
+ private boolean usingRowDelimiter;
private boolean fixedWidth;
@@ -148,6 +161,14 @@
public void setFile(Expression file) {
this.file = file;
}
+
+ public boolean isUsingRowDelimiter() {
+ return usingRowDelimiter;
+ }
+
+ public void setUsingRowDelimiter(boolean usingRowDelimiter) {
+ this.usingRowDelimiter = usingRowDelimiter;
+ }
@Override
public void acceptVisitor(LanguageVisitor visitor) {
@@ -168,6 +189,7 @@
clone.getColumns().add(column.clone());
}
clone.fixedWidth = this.fixedWidth;
+ clone.usingRowDelimiter = this.usingRowDelimiter;
return clone;
}
@@ -186,7 +208,8 @@
&& EquivalenceUtil.areEqual(escape, other.escape)
&& EquivalenceUtil.areEqual(quote, other.quote)
&& EquivalenceUtil.areEqual(header, other.header)
- && EquivalenceUtil.areEqual(skip, other.skip);
+ && EquivalenceUtil.areEqual(skip, other.skip)
+ && usingRowDelimiter == other.usingRowDelimiter;
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2011-08-11 18:49:54 UTC (rev 3377)
@@ -1277,11 +1277,7 @@
append(" "); //$NON-NLS-1$
}
- if (args.length < 2 || args[1] == null || !(args[1] instanceof Constant)) {
- append(UNDEFINED);
- } else {
- append(((Constant)args[1]).getValue());
- }
+ append(((Constant)args[1]).getValue());
}
append(")"); //$NON-NLS-1$
@@ -1811,10 +1807,24 @@
append(SPACE);
append(col.getWidth());
}
+ if (col.isNoTrim()) {
+ append(SPACE);
+ append(NO);
+ append(SPACE);
+ append(NonReserved.TRIM);
+ }
if (cols.hasNext()) {
append(","); //$NON-NLS-1$
}
}
+ if (!obj.isUsingRowDelimiter()) {
+ append(SPACE);
+ append(NO);
+ append(SPACE);
+ append(ROW);
+ append(SPACE);
+ append(NonReserved.DELIMITER);
+ }
if (obj.getDelimiter() != null) {
append(SPACE);
append(NonReserved.DELIMITER);
Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2011-08-11 18:49:54 UTC (rev 3377)
@@ -1474,6 +1474,9 @@
if (obj.getHeader() != null && obj.getHeader() < 0) {
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.text_table_negative"), obj); //$NON-NLS-1$
}
+ if (!obj.isUsingRowDelimiter()) {
+ handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.fixed_option"), obj); //$NON-NLS-1$
+ }
delimiter = obj.getDelimiter();
quote = obj.getQuote();
validateTextOptions(obj, delimiter, quote);
Modified: trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2011-08-11 18:49:54 UTC (rev 3377)
@@ -2287,6 +2287,7 @@
Expression file = null;
TextTable.TextColumn column = null;
List<TextTable.TextColumn> columns = new ArrayList<TextTable.TextColumn>();
+ boolean useRowDelimiter = true;
Character delimiter = null;
boolean escape = false;
Character quote = null;
@@ -2308,6 +2309,12 @@
}
)*
[
+ <NO> <ROW> nonReserved("DELIMITER")
+ {
+ useRowDelimiter = false;
+ }
+ ]
+ [
LOOKAHEAD(<ID>, { "delimiter".equalsIgnoreCase(getToken(1).image) }) <ID>
delimiter = charVal(info, "DELMITER")
]
@@ -2344,6 +2351,7 @@
result.setSkip(skip);
result.setName(validateAlias(aliasID));
result.setQuote(quote);
+ result.setUsingRowDelimiter(useRowDelimiter);
return result;
}
}
@@ -2353,6 +2361,7 @@
String name = null;
Constant datatype = null;
Integer width = null;
+ boolean noTrim = false;
}
{
name = id()
@@ -2360,9 +2369,15 @@
[
LOOKAHEAD(<ID>, { "width".equalsIgnoreCase(getToken(1).image) }) <ID>
width = intVal()
+ [ LOOKAHEAD(2)
+ <NO> nonReserved("TRIM")
+ {
+ noTrim = true;
+ }
+ ]
]
{
- return new TextTable.TextColumn(validateElementName(name), (String)datatype.getValue(), width);
+ return new TextTable.TextColumn(validateElementName(name), (String)datatype.getValue(), width, noTrim);
}
}
Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2011-08-11 18:49:54 UTC (rev 3377)
@@ -816,7 +816,8 @@
TextTableNode.character_not_allowed=Text parse error: Non-whitespace character found between the qualifier and the delimiter in text line {0} in {1}.
TextTableNode.unknown_escape=Text parse error: Unknown escape sequence \\{0} in text line {1} in {2}.
TextTableNode.invalid_width=Text parse error: Fixed width line width {0} is smaller than the expected {1} on text line {2} in {3}.
-TextTableNode.line_too_long=Text parse error: Delimited line is longer than the expected max of {2} on text line {0} in {1}.
+TextTableNode.line_too_long=Text parse error: Delimited line is longer than the expected max of {2} on text line {0} in {1}.
+ValidationVisitor.fixed_option=NO ROW DELIMITER can only be used in fixed parsing mode.
XMLTableNode.error=Error evaluating XQuery row context for XMLTable: {0}
XMLTableNode.path_error=Error evaluating XMLTable column path expression for column: {0}
Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestParser.java 2011-08-11 18:49:54 UTC (rev 3377)
@@ -6710,8 +6710,8 @@
TextTable tt = new TextTable();
tt.setFile(new ElementSymbol("file"));
List<TextTable.TextColumn> columns = new ArrayList<TextTable.TextColumn>();
- columns.add(new TextTable.TextColumn("x", "string", 1));
- columns.add(new TextTable.TextColumn("y", "date", 10));
+ columns.add(new TextTable.TextColumn("x", "string", 1, false));
+ columns.add(new TextTable.TextColumn("y", "date", 10, false));
tt.setColumns(columns);
tt.setSkip(10);
tt.setName("x");
Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestTextTable.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestTextTable.java 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestTextTable.java 2011-08-11 18:49:54 UTC (rev 3377)
@@ -159,6 +159,29 @@
process(sql, expected);
}
+ @Test public void testNoRowDelimiter() throws Exception {
+ String sql = "select * from texttable('abcdef' COLUMNS c1 string width 1, c2 string width 1 no row delimiter) x"; //$NON-NLS-1$
+
+ List[] expected = new List[] {
+ Arrays.asList("a","b"),
+ Arrays.asList("c","d"),
+ Arrays.asList("e","f"),
+ };
+
+ process(sql, expected);
+ }
+
+ @Test public void testNoTrim() throws Exception {
+ String sql = "select * from texttable('a b \nc d' COLUMNS c1 string width 2, c2 string width 2 no trim) x"; //$NON-NLS-1$
+
+ List[] expected = new List[] {
+ Arrays.asList("a","b "),
+ Arrays.asList("c"," d"),
+ };
+
+ process(sql, expected);
+ }
+
@Test public void testNoRows() throws Exception {
String sql = "select * from texttable('' COLUMNS c1 string, c2 string SKIP 3) x"; //$NON-NLS-1$
Modified: trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java 2011-08-11 18:49:54 UTC (rev 3377)
@@ -1901,5 +1901,10 @@
@Test public void testSimilar() throws Exception {
helpTestExpression("x similar to 'b' escape 'c'", "x SIMILAR TO 'b' ESCAPE 'c'");
}
+
+ @Test public void testTextTable() throws Exception {
+ String sql = "SELECT * from texttable(file columns x string WIDTH 1 NO TRIM NO ROW DELIMITER) as x"; //$NON-NLS-1$
+ helpTest(QueryParser.getQueryParser().parseCommand(sql), "SELECT * FROM TEXTTABLE(file COLUMNS x string WIDTH 1 NO TRIM NO ROW DELIMITER) AS x");
+ }
}
Modified: trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java 2011-08-11 15:59:42 UTC (rev 3376)
+++ trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java 2011-08-11 18:49:54 UTC (rev 3377)
@@ -1772,6 +1772,10 @@
helpValidate("SELECT * from texttable(null columns x string width 1 DELIMITER 'z') as x", new String[] {"TEXTTABLE(null COLUMNS x string WIDTH 1 DELIMITER 'z') AS x"}, RealMetadataFactory.exampleBQTCached());
}
+ @Test public void testTextTableNoRowDelimiter() {
+ helpValidate("SELECT * from texttable(null columns x string NO ROW DELIMITER) as x", new String[] {"TEXTTABLE(null COLUMNS x string NO ROW DELIMITER) AS x"}, RealMetadataFactory.exampleBQTCached());
+ }
+
@Test public void testXMLNamespaces() {
helpValidate("select xmlforest(xmlnamespaces(no default, default 'http://foo'), e1 as \"table\") from pm1.g1", new String[] {"XMLNAMESPACES(NO DEFAULT, DEFAULT 'http://foo')"}, RealMetadataFactory.example1Cached());
}
More information about the teiid-commits
mailing list