package org.beanfuse.db.dialect;
import java.sql.Types;
public class DB2Dialect extends AbstractDialect {
public DB2Dialect() {
super();
ss = new SequenceSupport();
ss.setQuerySequenceSql("select seqname from sysibm.syssequences");
ss.setNextValSql("values nextval for {}");
ss.setDropSql("drop sequence {} restrict");
ss.setSelectNextValSql("nextval for {}");
registerColumnType(Types.BOOLEAN, "smallint");
registerColumnType(Types.BIT, "smallint");
registerColumnType(Types.BIGINT, "bigint");
registerColumnType(Types.SMALLINT, "smallint");
registerColumnType(Types.TINYINT, "smallint");
registerColumnType(Types.INTEGER, "integer");
registerColumnType(Types.CHAR, "char(1)");
registerColumnType(Types.VARCHAR, "varchar($l)");
registerColumnType(Types.FLOAT, "float");
registerColumnType(Types.DOUBLE, "double");
registerColumnType(Types.DATE, "date");
registerColumnType(Types.TIME, "time");
registerColumnType(Types.TIMESTAMP, "timestamp");
registerColumnType(Types.VARBINARY, "varchar($l) for bit data");
registerColumnType(Types.NUMERIC, "numeric($p,$s)");
registerColumnType(Types.BLOB, "blob($l)");
registerColumnType(Types.CLOB, "clob($l)");
}
/**
* Render the <tt>rownumber() over ( .... ) as rownumber_,</tt> bit, that
* goes in the select list
*/
private String getRowNumber(String sql) {
StringBuffer rownumber = new StringBuffer(50).append("rownumber() over(");
int orderByIndex = sql.toLowerCase().indexOf("order by");
if (orderByIndex > 0 && !hasDistinct(sql)) {
rownumber.append(sql.substring(orderByIndex));
}
rownumber.append(") as rownumber_,");
return rownumber.toString();
}
private static boolean hasDistinct(String sql) {
return sql.toLowerCase().indexOf("select distinct") >= 0;
}
public String getLimitString(String sql, boolean hasOffset) {
int startOfSelect = sql.toLowerCase().indexOf("select");
StringBuffer pagingSelect = new StringBuffer(sql.length() + 100).append(
sql.substring(0, startOfSelect)) // add the comment
.append("select * from ( select ") // nest the main query in an
// outer select
.append(getRowNumber(sql)); // add the rownnumber bit into the
// outer query select list
if (hasDistinct(sql)) {
pagingSelect.append(" row_.* from ( ") // add another (inner) nested
// select
.append(sql.substring(startOfSelect)) // add the main query
.append(" ) as row_"); // close off the inner nested select
} else {
pagingSelect.append(sql.substring(startOfSelect + 6)); // add the
// main
// query
}
pagingSelect.append(" ) as temp_ where rownumber_ ");
// add the restriction to the outer select
if (hasOffset) {
pagingSelect.append("between ?+1 and ?");
} else {
pagingSelect.append("<= ?");
}
return pagingSelect.toString();
}
}