JAVA   53

HSQLDB extends SQL92

Guest on 11th May 2022 04:44:16 PM

  1. package de.fuberlin.wiwiss.d2rq.sql.vendor;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. import java.sql.Types;
  7.  
  8. import de.fuberlin.wiwiss.d2rq.sql.types.DataType;
  9. import de.fuberlin.wiwiss.d2rq.sql.types.SQLApproximateNumeric;
  10. import de.fuberlin.wiwiss.d2rq.sql.types.SQLBinary;
  11. import de.fuberlin.wiwiss.d2rq.sql.types.SQLCharacterString;
  12. import de.fuberlin.wiwiss.d2rq.sql.types.SQLInterval;
  13. import de.fuberlin.wiwiss.d2rq.sql.types.UnsupportedDataType;
  14.  
  15. public class HSQLDB extends SQL92 {
  16.  
  17.         public HSQLDB() {
  18.                 super(true);
  19.         }
  20.        
  21.         @Override
  22.         public DataType getDataType(int jdbcType, String name, int size) {
  23.  
  24.                 // Doesn't support DISTINCT over LOB types
  25.                 if (jdbcType == Types.CLOB || "NCLOB".equals(name)) {
  26.                         return new SQLCharacterString(this, name, false);
  27.                 }
  28.                 if (jdbcType == Types.BLOB) {
  29.                         return new SQLBinary(this, name, false);
  30.                 }
  31.                
  32.                 // HSQLDB 2.2.8 reports INTERVAL types as VARCHAR
  33.                 if (jdbcType == Types.VARCHAR && name.startsWith("INTERVAL")) {
  34.                         return new SQLInterval(this, name);
  35.                 }
  36.                
  37.                 // HSQLDB supports NaN and +/-INF in DOUBLE
  38.                 if (jdbcType == Types.DOUBLE || jdbcType == Types.FLOAT || jdbcType == Types.REAL) {
  39.                         return new HSQLDBCompatibilityDoubleDataType(this);
  40.                 }
  41.                
  42.         // OTHER in HSQLDB 2.2.8 is really JAVA_OBJECT
  43.                 if (jdbcType == Types.OTHER) {
  44.                         return new UnsupportedDataType(jdbcType, name);
  45.                 }
  46.  
  47.                 return super.getDataType(jdbcType, name, size);
  48.         }
  49.  
  50.         @Override
  51.         public void initializeConnection(Connection connection) throws SQLException {
  52.                 // Enable storage of special Double values: NaN, INF, -INF
  53.                 Statement stmt = connection.createStatement();
  54.                 try {
  55.                         stmt.execute("SET DATABASE SQL DOUBLE NAN FALSE");
  56.                 } finally {
  57.                         stmt.close();
  58.                 }
  59.         }
  60.  
  61.         public static class HSQLDBCompatibilityDoubleDataType extends SQLApproximateNumeric {
  62.                 public HSQLDBCompatibilityDoubleDataType(Vendor syntax) {
  63.                         super(syntax, "DOUBLE");
  64.                 }
  65.                 public String toSQLLiteral(String value) {
  66.                         if ("NaN".equals(value)) {
  67.                                 return "(0E0/0E0)";
  68.                         } else if ("INF".equals(value)) {
  69.                                 return "(1E0/0)";
  70.                         } else if ("-INF".equals(value)) {
  71.                                 return "(-1E0/0)";
  72.                         }
  73.                         return super.toSQLLiteral(value);
  74.                 }
  75.         }
  76. }

Raw Paste


Login or Register to edit or fork this paste. It's free.