· 4 years ago · Apr 15, 2021, 04:52 PM
1import java.sql.Types;
2import org.hibernate.dialect.Dialect;
3import org.hibernate.dialect.function.StandardSQLFunction;
4import org.hibernate.dialect.function.SQLFunctionTemplate;
5import org.hibernate.dialect.function.VarArgsSQLFunction;
6import org.hibernate.dialect.identity.IdentityColumnSupport;
7import org.hibernate.type.StringType;
8
9public class SQLiteDialect extends Dialect {
10 public SQLiteDialect() {
11 registerColumnType(Types.BIT, "integer");
12 registerColumnType(Types.TINYINT, "tinyint");
13 registerColumnType(Types.SMALLINT, "smallint");
14 registerColumnType(Types.INTEGER, "integer");
15 registerColumnType(Types.BIGINT, "bigint");
16 registerColumnType(Types.FLOAT, "float");
17 registerColumnType(Types.REAL, "real");
18 registerColumnType(Types.DOUBLE, "double");
19 registerColumnType(Types.NUMERIC, "numeric");
20 registerColumnType(Types.DECIMAL, "decimal");
21 registerColumnType(Types.CHAR, "char");
22 registerColumnType(Types.VARCHAR, "varchar");
23 registerColumnType(Types.LONGVARCHAR, "longvarchar");
24 registerColumnType(Types.DATE, "date");
25 registerColumnType(Types.TIME, "time");
26 registerColumnType(Types.TIMESTAMP, "timestamp");
27 registerColumnType(Types.BINARY, "blob");
28 registerColumnType(Types.VARBINARY, "blob");
29 registerColumnType(Types.LONGVARBINARY, "blob");
30 registerColumnType(Types.BLOB, "blob");
31 registerColumnType(Types.CLOB, "clob");
32 registerColumnType(Types.BOOLEAN, "integer");
33
34 registerFunction( "concat", new VarArgsSQLFunction(StringType.INSTANCE, "", "||", "") );
35 registerFunction( "mod", new SQLFunctionTemplate( StringType.INSTANCE, "?1 % ?2" ) );
36 registerFunction( "substr", new StandardSQLFunction("substr", StringType.INSTANCE) );
37 registerFunction( "substring", new StandardSQLFunction( "substr", StringType.INSTANCE) );
38 }
39
40 @Override
41 public IdentityColumnSupport getIdentityColumnSupport() {
42 return new SQLiteIdentityColumnSupport();
43 }
44
45 public boolean supportsIdentityColumns() {
46 return true;
47 }
48
49 public boolean hasDataTypeInIdentityColumn() {
50 return false; // As specify in NHibernate dialect
51 }
52
53 public String getIdentityColumnString() {
54 // return "integer primary key autoincrement";
55 return "integer";
56 }
57
58 public String getIdentitySelectString() {
59 return "select last_insert_rowid()";
60 }
61
62 public boolean supportsLimit() {
63 return true;
64 }
65
66 protected String getLimitString(String query, boolean hasOffset) {
67 return new StringBuffer(query.length()+20).
68 append(query).
69 append(hasOffset ? " limit ? offset ?" : " limit ?").
70 toString();
71 }
72
73 public boolean supportsTemporaryTables() {
74 return true;
75 }
76
77 public String getCreateTemporaryTableString() {
78 return "create temporary table if not exists";
79 }
80
81 public boolean dropTemporaryTableAfterUse() {
82 return false;
83 }
84
85 public boolean supportsCurrentTimestampSelection() {
86 return true;
87 }
88
89 public boolean isCurrentTimestampSelectStringCallable() {
90 return false;
91 }
92
93 public String getCurrentTimestampSelectString() {
94 return "select current_timestamp";
95 }
96
97 public boolean supportsUnionAll() {
98 return true;
99 }
100
101 public boolean hasAlterTable() {
102 return false; // As specify in NHibernate dialect
103 }
104
105 public boolean dropConstraints() {
106 return false;
107 }
108
109 public String getAddColumnString() {
110 return "add column";
111 }
112
113 public String getForUpdateString() {
114 return "";
115 }
116
117 public boolean supportsOuterJoinForUpdate() {
118 return false;
119 }
120
121 public String getDropForeignKeyString() {
122 throw new UnsupportedOperationException("No drop foreign key syntax supported by SQLiteDialect");
123 }
124
125 public String getAddForeignKeyConstraintString(String constraintName,
126 String[] foreignKey, String referencedTable, String[] primaryKey,
127 boolean referencesPrimaryKey) {
128 throw new UnsupportedOperationException("No add foreign key syntax supported by SQLiteDialect");
129 }
130
131 public String getAddPrimaryKeyConstraintString(String constraintName) {
132 throw new UnsupportedOperationException("No add primary key syntax supported by SQLiteDialect");
133 }
134
135 public boolean supportsIfExistsBeforeTableName() {
136 return true;
137 }
138
139 public boolean supportsCascadeDelete() {
140 return false;
141 }
142}