Author: rareddy
Date: 2012-08-02 19:10:40 -0400 (Thu, 02 Aug 2012)
New Revision: 4295
Modified:
trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
trunk/engine/src/main/resources/org/teiid/query/i18n.properties
trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java
Log:
TEIID-2083 - Adding the parser code to recognize the UDT option on the column. If this
option is found then the datatype will be replaced with supported user defined
designer's index type. Also the length, and precision and scale captured on the
column
Modified: trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java 2012-08-02
20:42:06 UTC (rev 4294)
+++ trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java 2012-08-02
23:10:40 UTC (rev 4295)
@@ -34,20 +34,13 @@
import org.teiid.core.util.PropertiesUtils;
import org.teiid.core.util.StringUtil;
import org.teiid.language.SQLConstants.Reserved;
-import org.teiid.metadata.AbstractMetadataRecord;
-import org.teiid.metadata.BaseColumn;
-import org.teiid.metadata.Column;
-import org.teiid.metadata.FunctionMethod;
-import org.teiid.metadata.FunctionParameter;
-import org.teiid.metadata.MetadataFactory;
-import org.teiid.metadata.Procedure;
-import org.teiid.metadata.ProcedureParameter;
-import org.teiid.metadata.Table;
+import org.teiid.metadata.*;
import org.teiid.metadata.Column.SearchType;
import org.teiid.metadata.ProcedureParameter.Type;
import org.teiid.query.QueryPlugin;
import org.teiid.query.function.FunctionMethods;
import org.teiid.query.metadata.DDLConstants;
+import org.teiid.query.metadata.SystemMetadata;
import org.teiid.query.sql.lang.*;
import org.teiid.query.sql.lang.ExistsCriteria.SubqueryHint;
import org.teiid.query.sql.proc.Block;
@@ -57,6 +50,8 @@
public class SQLParserUtil {
+ static Pattern udtPattern =
Pattern.compile("(\\w+)\\s*\\(\\s*(\\d+),\\s*(\\d+),\\s*(\\d+)\\)");
//$NON-NLS-1$
+
public static final boolean DECIMAL_AS_DOUBLE =
PropertiesUtils.getBooleanProperty(System.getProperties(),
"org.teiid.decimalAsDouble", false); //$NON-NLS-1$
String matchesAny(String arg, String ... expected) {
@@ -357,7 +352,7 @@
return new Block(stmt);
}
- void setColumnOptions(BaseColumn c){
+ void setColumnOptions(BaseColumn c) throws ParseException {
Map<String, String> props = c.getProperties();
setCommonProperties(c, props);
@@ -371,7 +366,7 @@
}
}
- private void setColumnOptions(Column c, Map<String, String> props) {
+ private void setColumnOptions(Column c, Map<String, String> props) throws
ParseException {
String v = props.remove(DDLConstants.CASE_SENSITIVE);
if (v != null) {
c.setCaseSensitive(isTrue(v));
@@ -436,6 +431,21 @@
if (v != null) {
c.setDistinctValues(Integer.parseInt(v));
}
+
+ v = props.remove(DDLConstants.UDT);
+ if (v != null) {
+ Matcher matcher = udtPattern.matcher(v);
+ Map<String, Datatype> datatypes =
SystemMetadata.getInstance().getSystemStore().getDatatypes();
+ if (matcher.matches() && datatypes.get(matcher.group(1)) != null) {
+ c.setDatatype(datatypes.get(matcher.group(1)));
+ c.setLength(Integer.parseInt(matcher.group(2)));
+ c.setPrecision(Integer.parseInt(matcher.group(3)));
+ c.setScale(Integer.parseInt(matcher.group(4)));
+ }
+ else {
+ throw new ParseException(QueryPlugin.Util.getString("udt_format_wrong",
c.getName())); //$NON-NLS-1$
+ }
+ }
}
void setCommonProperties(AbstractMetadataRecord c, Map<String, String> props) {
Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2012-08-02 20:42:06
UTC (rev 4294)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2012-08-02 23:10:40
UTC (rev 4295)
@@ -1026,4 +1026,5 @@
TEIID31107=Procedure {0} can only have 1 RESULT/return value
SQLParser.proc_type_conflict=Result type {1} conflicts with return type {2} for procedure
{0}
-SQLParser.param_out=Procedure {0} RESULT param {1} must be of type OUT.
\ No newline at end of file
+SQLParser.param_out=Procedure {0} RESULT param {1} must be of type OUT.
+udt_format_wrong=UDT option mentioned on column "{0}" is wrong. It must be in
the form UDT=name(length,precision,scale). Otherwise UDT data type specified is not a
known data type to Teiid.
\ No newline at end of file
Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java 2012-08-02
20:42:06 UTC (rev 4294)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java 2012-08-02
23:10:40 UTC (rev 4295)
@@ -129,6 +129,22 @@
}
@Test
+ public void testUDT() throws Exception {
+ String ddl = "CREATE FOREIGN TABLE G1( e1 integer, e2 varchar OPTIONS (UDT
'NMTOKENS(12,13,14)'))";
+
+ Schema s = helpParse(ddl, "model").getSchema();
+ Map<String, Table> tableMap = s.getTables();
+
+ assertTrue("Table not found", tableMap.containsKey("G1"));
+ Table table = tableMap.get("G1");
+
+ assertEquals("NMTOKENS", table.getColumns().get(1).getDatatype().getName());
+ assertEquals(12, table.getColumns().get(1).getLength());
+ assertEquals(13, table.getColumns().get(1).getPrecision());
+ assertEquals(14, table.getColumns().get(1).getScale());
+ }
+
+ @Test
public void testMultiKeyPK() throws Exception {
String ddl = "CREATE FOREIGN TABLE G1( e1 integer, e2 varchar, e3 date CONSTRAINT
PRIMARY KEY (e1, e2))";