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(); } }