JAVA   49

SQLServer extends SQL92

Guest on 11th May 2022 04:51:24 PM

  1. package de.fuberlin.wiwiss.d2rq.sql.vendor;
  2.  
  3. import java.sql.Types;
  4.  
  5. import de.fuberlin.wiwiss.d2rq.map.Database;
  6. import de.fuberlin.wiwiss.d2rq.sql.SQL;
  7. import de.fuberlin.wiwiss.d2rq.sql.types.DataType;
  8. import de.fuberlin.wiwiss.d2rq.sql.types.SQLBinary;
  9. import de.fuberlin.wiwiss.d2rq.sql.types.SQLBit;
  10. import de.fuberlin.wiwiss.d2rq.sql.types.SQLCharacterString;
  11. import de.fuberlin.wiwiss.d2rq.sql.types.SQLDate;
  12.  
  13. /**
  14.  * This syntax class implements SQL syntax for MS SQL Server
  15.  * and MS Access.
  16.  *
  17.  * @author Richard Cyganiak
  18.  */
  19. public class SQLServer extends SQL92 {
  20.  
  21.         public SQLServer() {
  22.                 super(true);
  23.         }
  24.        
  25.         @Override
  26.         public String getRowNumLimitAsSelectModifier(int limit) {
  27.                 if (limit == Database.NO_LIMIT) return "";
  28.                 return "TOP " + limit;
  29.         }
  30.  
  31.         @Override
  32.         public String getRowNumLimitAsQueryAppendage(int limit) {
  33.                 return "";
  34.         }
  35.        
  36.         @Override
  37.         public String quoteBinaryLiteral(String hexString) {
  38.                 if (!SQL.isHexString(hexString)) {
  39.                         throw new IllegalArgumentException("Not a hex string: '" + hexString + "'");
  40.                 }
  41.                 return "0x" + hexString;               
  42.         }
  43.        
  44.         @Override
  45.         public String quoteDateLiteral(String date) {
  46.                 // TODO Reportedly, MS Access requires #YYYY-MM-DD#
  47.                 return quoteStringLiteral(date);
  48.         }
  49.        
  50.         @Override
  51.         public String quoteTimeLiteral(String time) {
  52.                 // TODO Reportedly, MS Access requires #HH:mm:ss#
  53.                 return quoteStringLiteral(time);
  54.         }
  55.        
  56.         @Override
  57.         public String quoteTimestampLiteral(String timestamp) {
  58.                 // TODO Reportedly, MS Access requires #YYYY-MM-DD HH:mm:ss#
  59.                 return quoteStringLiteral(timestamp);
  60.         }
  61.  
  62.         @Override
  63.         public DataType getDataType(int jdbcType, String name, int size) {
  64.                 // MS SQLServer 2008 driver returns DATE as VARCHAR type
  65.                 if (name.equals("DATE")) {
  66.                         return new SQLDate(this, name);
  67.                 }
  68.                
  69.                 // On SQL Server, BIT is a single-bit numeric type
  70.                 if (jdbcType == Types.BIT) {
  71.                         return new SQLServerCompatibilityBitDataType(this);
  72.                 }
  73.  
  74.                 // Doesn't support DISTINCT over LOB types
  75.                 if (jdbcType == Types.CLOB || "NCLOB".equals(name)) {
  76.                         return new SQLCharacterString(this, name, false);
  77.                 }
  78.                 if (jdbcType == Types.BLOB) {
  79.                         return new SQLBinary(this, name, false);
  80.                 }
  81.  
  82.                 return super.getDataType(jdbcType, name, size);
  83.         }
  84.  
  85.         @Override
  86.         public boolean isIgnoredTable(String schema, String table) {
  87.                 // MS SQL Server has schemas "sys" and "information_schema" in every DB
  88.         // along with tables which need to be ignored
  89.                 return "sys".equals(schema) || "INFORMATION_SCHEMA".equals(schema) || "sysdiagrams".equals(table);
  90.         }
  91.  
  92.         private static class SQLServerCompatibilityBitDataType extends SQLBit {
  93.                 public SQLServerCompatibilityBitDataType(Vendor syntax) {
  94.                         super(syntax, "BIT");
  95.                 }
  96.                 public String toSQLLiteral(String value) {
  97.                         // On SQL Server, BIT is a single-bit numeric type
  98.                         try {
  99.                                 return Integer.parseInt(value) == 0 ? "0" : "1";
  100.                         } catch (NumberFormatException nfex) {
  101.                                 // Not 0 or 1
  102.                                 DataType.log.warn("Unsupported BIT format: '" + value + "'; treating as NULL");
  103.                                 return "NULL";
  104.                         }
  105.                 }
  106.                 public String valueRegex() {
  107.                         return "^[01]$";
  108.                 }
  109.         }
  110. }

Raw Paste


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