Changeset: dd9b4fb14256 for monetdb-java
URL: https://dev.monetdb.org/hg/monetdb-java/rev/dd9b4fb14256
Modified Files:
        ChangeLog
        src/main/java/org/monetdb/jdbc/MonetDatabaseMetaData.java
        src/main/java/org/monetdb/jdbc/MonetDriver.java.in
        src/main/java/org/monetdb/jdbc/MonetPreparedStatement.java
        src/main/java/org/monetdb/jdbc/MonetResultSet.java
        tests/JDBC_API_Tester.java
Branch: default
Log Message:

Added recognition of 'xml' type.
Use default mapping to Types.VARCHAR for easy and fast (as java.lang.String) 
retrieval, display and setting data of columns of type 'xml'.


diffs (136 lines):

diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,11 @@
 # ChangeLog file for monetdb-java
 # This file is updated with Maddlog
 
+* Thu Feb 10 2022 Martin van Dinther <martin.van.dint...@monetdbsolutions.com>
+- Added recognition of 'xml' type. Use default mapping to Types.VARCHAR for
+  easy and fast (as java.lang.String) retrieval, display and setting data of
+  columns of type 'xml'.
+
 * Thu Jan 27 2022 Martin van Dinther <martin.van.dint...@monetdbsolutions.com>
 - Compiled and released new jar files: monetdb-jdbc-3.2.jre8.jar,
   monetdb-mcl-1.21.jre8.jar and jdbcclient.jre8.jar
diff --git a/src/main/java/org/monetdb/jdbc/MonetDatabaseMetaData.java 
b/src/main/java/org/monetdb/jdbc/MonetDatabaseMetaData.java
--- a/src/main/java/org/monetdb/jdbc/MonetDatabaseMetaData.java
+++ b/src/main/java/org/monetdb/jdbc/MonetDatabaseMetaData.java
@@ -2964,10 +2964,10 @@ public class MonetDatabaseMetaData
                        
"cast(").append(MonetDriver.getSQLTypeMap("\"sqlname\"")).append(" AS int) AS 
\"DATA_TYPE\", " +
                        "\"digits\" AS \"PRECISION\", " +       // note that 
when radix is 2 the precision shows the number of bits
                        "cast(CASE WHEN \"sqlname\" IN 
('char','varchar','sec_interval','day_interval','month_interval') THEN ''''" +
-                               " WHEN \"sqlname\" IN 
('clob','inet','json','url','uuid','date','time','timetz','timestamp','timestamptz','blob','sqlblob')
 THEN \"sqlname\"||' '''" +
+                               " WHEN \"sqlname\" IN 
('clob','inet','json','url','uuid','date','time','timetz','timestamp','timestamptz','blob','sqlblob','xml')
 THEN \"sqlname\"||' '''" +
                                " ELSE NULL END AS varchar(16)) AS 
\"LITERAL_PREFIX\", " +
                        "cast(CASE WHEN \"sqlname\" IN 
('char','varchar','sec_interval','day_interval','month_interval'" +
-                                               
",'clob','inet','json','url','uuid','date','time','timetz','timestamp','timestamptz','blob','sqlblob')
 THEN ''''" +
+                                               
",'clob','inet','json','url','uuid','date','time','timetz','timestamp','timestamptz','blob','sqlblob','xml')
 THEN ''''" +
                                " ELSE NULL END AS varchar(2)) AS 
\"LITERAL_SUFFIX\", " +
                        "CASE WHEN \"sqlname\" IN ('char','varchar') THEN 'max 
length'" +
                                " WHEN \"sqlname\" = 'decimal' THEN 'precision, 
scale'" +
@@ -2975,8 +2975,8 @@ public class MonetDatabaseMetaData
                                " ELSE NULL END AS \"CREATE_PARAMS\", " +
                        "cast(CASE WHEN \"systemname\" = 'oid' THEN 
").append(DatabaseMetaData.typeNoNulls)
                                .append(" ELSE 
").append(DatabaseMetaData.typeNullable).append(" END AS smallint) AS 
\"NULLABLE\", " +
-                       "CASE WHEN \"systemname\" IN ('str','json','url') THEN 
true ELSE false END AS \"CASE_SENSITIVE\", " +
-                       "cast(CASE WHEN \"systemname\" IN 
('str','inet','json','url','uuid') THEN 
").append(DatabaseMetaData.typeSearchable)
+                       "CASE WHEN \"systemname\" IN ('str','json','url','xml') 
THEN true ELSE false END AS \"CASE_SENSITIVE\", " +
+                       "cast(CASE WHEN \"systemname\" IN 
('str','inet','json','url','uuid','xml') THEN 
").append(DatabaseMetaData.typeSearchable)
                                .append(" ELSE 
").append(DatabaseMetaData.typePredBasic).append(" END AS smallint) AS 
\"SEARCHABLE\", " +
                        "CASE WHEN \"sqlname\" IN 
('tinyint','smallint','int','bigint','hugeint','decimal','real','double'" +
                                
",'day_interval','month_interval','sec_interval') THEN false ELSE true END AS 
\"UNSIGNED_ATTRIBUTE\", " +
@@ -3261,8 +3261,10 @@ public class MonetDatabaseMetaData
                                " WHEN 'json' THEN 'java.lang.String'" +
                                " WHEN 'url' THEN 'org.monetdb.jdbc.types.URL'" 
+
                                " WHEN 'uuid' THEN 'java.lang.String'" +
+                               // next UDT only when "CREATE TYPE xml EXTERNAL 
NAME xml;" is executed
+                               " WHEN 'xml' THEN 'java.lang.String'" +
                                " ELSE 'java.lang.Object' END AS 
\"CLASS_NAME\", " +
-                       "cast(CASE WHEN t.\"sqlname\" IN ('inet', 'json', 
'url', 'uuid') THEN ").append(Types.JAVA_OBJECT)
+                       "cast(CASE WHEN t.\"sqlname\" IN 
('inet','json','url','uuid','xml') THEN ").append(Types.JAVA_OBJECT)
                                .append(" ELSE ").append(Types.STRUCT).append(" 
END AS int) AS \"DATA_TYPE\", " +
                        "t.\"systemname\" AS \"REMARKS\", " +
                        "cast(null as smallint) AS \"BASE_TYPE\" " +
diff --git a/src/main/java/org/monetdb/jdbc/MonetDriver.java.in 
b/src/main/java/org/monetdb/jdbc/MonetDriver.java.in
--- a/src/main/java/org/monetdb/jdbc/MonetDriver.java.in
+++ b/src/main/java/org/monetdb/jdbc/MonetDriver.java.in
@@ -352,7 +352,7 @@ public class MonetDriver implements Driv
                typeMap.put("real", Integer.valueOf(Types.REAL));
                typeMap.put("sec_interval", Integer.valueOf(Types.DECIMAL));
                typeMap.put("smallint", Integer.valueOf(Types.SMALLINT));
-               typeMap.put("str", Integer.valueOf(Types.VARCHAR));     // 
MonetDB prepare <stmt> uses type 'str' (instead of varchar) for the schema, 
table and column metadata output
+               typeMap.put("str", Integer.valueOf(Types.VARCHAR));     // 
MonetDB prepare <stmt> uses type 'str' (instead of varchar) for the schema, 
table and column metadata output. DO NOT REMOVE this entry!
                // typeMap.put("table", Integer.valueOf(Types.???));
                typeMap.put("time", Integer.valueOf(Types.TIME));
                typeMap.put("timestamp", Integer.valueOf(Types.TIMESTAMP));
@@ -362,7 +362,8 @@ public class MonetDriver implements Driv
                typeMap.put("url", Integer.valueOf(Types.VARCHAR));
                typeMap.put("uuid", Integer.valueOf(Types.VARCHAR));
                typeMap.put("varchar", Integer.valueOf(Types.VARCHAR));
-               typeMap.put("wrd", Integer.valueOf(Types.BIGINT));  // keep it 
in for older MonetDB servers
+               typeMap.put("wrd", Integer.valueOf(Types.BIGINT));      // keep 
it in for old (pre Dec2016) MonetDB servers
+               typeMap.put("xml", Integer.valueOf(Types.VARCHAR));     // used 
when "CREATE TYPE xml EXTERNAL NAME xml;" is executed
        }
 
        /**
diff --git a/src/main/java/org/monetdb/jdbc/MonetPreparedStatement.java 
b/src/main/java/org/monetdb/jdbc/MonetPreparedStatement.java
--- a/src/main/java/org/monetdb/jdbc/MonetPreparedStatement.java
+++ b/src/main/java/org/monetdb/jdbc/MonetPreparedStatement.java
@@ -2336,9 +2336,13 @@ public class MonetPreparedStatement
                                                }
                                                castprefix = "uuid ";
                                                break;
+                                       // case "xml":
+                                               // currently any string is 
accepted by MonetDB, so no validity check needed
+                                               // castprefix = "xml ";  also 
do NOT add a cast as MonetDB implicitly already converts a String to an xml 
String
+                                               // break;
                                }
                                if (castprefix != null) {
-                                       /* in specific cases prefix the string 
with: inet or json or url or uuid casting */
+                                       /* in specific cases prefix the string 
with: inet or json or url or uuid or xml casting */
                                        setValue(parameterIndex, castprefix + 
MonetWrapper.sq(x));
                                } else {
                                        setValue(parameterIndex, 
MonetWrapper.sq(x));
diff --git a/src/main/java/org/monetdb/jdbc/MonetResultSet.java 
b/src/main/java/org/monetdb/jdbc/MonetResultSet.java
--- a/src/main/java/org/monetdb/jdbc/MonetResultSet.java
+++ b/src/main/java/org/monetdb/jdbc/MonetResultSet.java
@@ -2064,8 +2064,8 @@ public class MonetResultSet
                                return Boolean.valueOf(val);
                        case Types.VARCHAR:
                        {
-                               // The MonetDB types: inet, json, url and uuid 
are all mapped to Types.VARCHAR in MonetDriver.typeMap
-                               // For these MonetDB types (except json, see 
comments below) we try to create objects of the corresponding class.
+                               // The MonetDB types: inet, json, url, uuid and 
xml are all mapped to Types.VARCHAR in MonetDriver.typeMap
+                               // For these MonetDB types (except json and 
xml, see comments below) we try to create objects of the corresponding class.
                                final String MonetDBType = types[columnIndex - 
1];
                                switch (MonetDBType.length()) {
                                case 3:
diff --git a/tests/JDBC_API_Tester.java b/tests/JDBC_API_Tester.java
--- a/tests/JDBC_API_Tester.java
+++ b/tests/JDBC_API_Tester.java
@@ -690,6 +690,14 @@ final public class JDBC_API_Tester {
                }
 
                try {
+                       int response = stmt.executeUpdate("CREATE TYPE xml 
EXTERNAL NAME xml");
+                       if (response != Statement.SUCCESS_NO_INFO)
+                               sb.append("Creating type xml failed to return 
-2!! It returned: " + response + "\n");
+               } catch (SQLException e) {
+                       sb.append("failed to create type xml: 
").append(e.getMessage());
+               }
+
+               try {
                        DatabaseMetaData dbmd = con.getMetaData();
 
                        // inspect the catalog by use of dbmd functions
@@ -780,7 +788,8 @@ final public class JDBC_API_Tester {
                        "null   sys     inet    org.monetdb.jdbc.types.INET     
2000    inet    null\n" +
                        "null   sys     json    java.lang.String        2000    
json    null\n" +
                        "null   sys     url     org.monetdb.jdbc.types.URL      
2000    url     null\n" +
-                       "null   sys     uuid    java.lang.String        2000    
uuid    null\n");
+                       "null   sys     uuid    java.lang.String        2000    
uuid    null\n" +
+                       "null   sys     xml     java.lang.String        2000    
xml     null\n");
 
                        int[] UDTtypes = { Types.STRUCT, Types.DISTINCT };
                        compareResultSet(dbmd.getUDTs(null, "sys", null, 
UDTtypes), "getUDTs(null, sys, null, UDTtypes",
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to