[#727] Simulate RPAD and LPAD in SQLite

This commit is contained in:
Lukas Eder 2012-07-19 21:49:28 +02:00
parent 723bff2419
commit 12e6e295c6
4 changed files with 35 additions and 55 deletions

View File

@ -483,7 +483,6 @@ extends BaseTest<A, AP, B, S, B2S, BS, L, X, DATE, BOOL, D, T, U, I, IPK, T658,
// RPAD, LPAD
switch (getDialect()) {
case DERBY:
case SQLITE:
log.info("SKIPPING", "RPAD and LPAD functions");
break;

View File

@ -2653,7 +2653,7 @@ public class Factory implements FactoryOperations {
*
* @see #rpad(Field, Field)
*/
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLSERVER, SYBASE })
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
public static Field<String> rpad(Field<String> field, int length) {
return rpad(nullSafe(field), val(length));
}
@ -2667,7 +2667,7 @@ public class Factory implements FactoryOperations {
* well, depending on the RDBMS:
* <code><pre>concat([field], repeat(' ', [length] - length([field])))</pre></code>
*/
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLSERVER, SYBASE })
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
public static Field<String> rpad(Field<String> field, Field<? extends Number> length) {
return new Rpad(nullSafe(field), nullSafe(length));
}
@ -2677,7 +2677,7 @@ public class Factory implements FactoryOperations {
*
* @see #rpad(Field, Field, Field)
*/
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLSERVER, SYBASE })
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
public static Field<String> rpad(Field<String> field, int length, char character) {
return rpad(field, length, Character.toString(character));
}
@ -2687,7 +2687,7 @@ public class Factory implements FactoryOperations {
*
* @see #rpad(Field, Field, Field)
*/
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLSERVER, SYBASE })
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
public static Field<String> rpad(Field<String> field, int length, String character) {
return rpad(nullSafe(field), val(length), val(character, String.class));
}
@ -2701,7 +2701,7 @@ public class Factory implements FactoryOperations {
* well, depending on the RDBMS:
* <code><pre>concat([field], repeat([character], [length] - length([field])))</pre></code>
*/
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLSERVER, SYBASE })
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
public static Field<String> rpad(Field<String> field, Field<? extends Number> length, Field<String> character) {
return new Rpad(nullSafe(field), nullSafe(length), nullSafe(character));
}
@ -2711,7 +2711,7 @@ public class Factory implements FactoryOperations {
*
* @see #lpad(Field, Field)
*/
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLSERVER, SYBASE })
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
public static Field<String> lpad(Field<String> field, int length) {
return lpad(nullSafe(field), val(length));
}
@ -2725,7 +2725,7 @@ public class Factory implements FactoryOperations {
* well, depending on the RDBMS:
* <code><pre>concat(repeat(' ', [length] - length([field])), [field])</pre></code>
*/
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLSERVER, SYBASE })
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
public static Field<String> lpad(Field<String> field, Field<? extends Number> length) {
return new Lpad(nullSafe(field), nullSafe(length));
}
@ -2735,7 +2735,7 @@ public class Factory implements FactoryOperations {
*
* @see #lpad(Field, Field, Field)
*/
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLSERVER, SYBASE })
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
public static Field<String> lpad(Field<String> field, int length, char character) {
return lpad(field, length, Character.toString(character));
}
@ -2745,7 +2745,7 @@ public class Factory implements FactoryOperations {
*
* @see #lpad(Field, Field, Field)
*/
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLSERVER, SYBASE })
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
public static Field<String> lpad(Field<String> field, int length, String character) {
return lpad(nullSafe(field), val(length), val(character, String.class));
}
@ -2759,7 +2759,7 @@ public class Factory implements FactoryOperations {
* well, depending on the RDBMS:
* <code><pre>concat(repeat([character], [length] - length([field])), [field])</pre></code>
*/
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLSERVER, SYBASE })
@Support({ ASE, CUBRID, DB2, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
public static Field<String> lpad(Field<String> field, Field<? extends Number> length, Field<String> character) {
return new Lpad(nullSafe(field), nullSafe(length), nullSafe(character));
}

View File

@ -36,11 +36,10 @@
package org.jooq.impl;
import static org.jooq.impl.Factory.function;
import static org.jooq.impl.Factory.val;
import static org.jooq.impl.Factory.inline;
import org.jooq.Configuration;
import org.jooq.Field;
import org.jooq.SQLDialect;
/**
* @author Lukas Eder
@ -65,7 +64,7 @@ class Lpad extends AbstractFunction<String> {
this.field = field;
this.length = length;
this.character = character;
this.character = (character == null ? inline(" ") : character);
}
@Override
@ -74,28 +73,19 @@ class Lpad extends AbstractFunction<String> {
case ASE:
case SQLSERVER:
case SYBASE: {
if (character == null) {
return Factory.concat(Factory.repeat(" ", length.sub(Factory.length(field))), field);
}
else {
return Factory.concat(Factory.repeat(character, length.sub(Factory.length(field))), field);
}
return Factory.concat(Factory.repeat(character, length.sub(Factory.length(field))), field);
}
// This beautiful expression was contributed by "Ludo", here:
// http://stackoverflow.com/questions/6576343/how-to-simulate-lpad-rpad-with-sqlite
case SQLITE: {
return Factory.field("replace(replace(substr(quote(zeroblob(({0} + 1) / 2)), 3, ({1} - length({2}))), '''', ''), '0', {3}) || {4}",
String.class,
length, length, field, character, field);
}
default: {
// MySQL only knows the 3 parameter version
if (character == null) {
if (configuration.getDialect() == SQLDialect.MYSQL) {
return function("lpad", SQLDataType.VARCHAR, field, length, val(" "));
}
else {
return function("lpad", SQLDataType.VARCHAR, field, length);
}
}
else {
return function("lpad", SQLDataType.VARCHAR, field, length, character);
}
return function("lpad", SQLDataType.VARCHAR, field, length, character);
}
}
}

View File

@ -36,11 +36,10 @@
package org.jooq.impl;
import static org.jooq.impl.Factory.function;
import static org.jooq.impl.Factory.val;
import static org.jooq.impl.Factory.inline;
import org.jooq.Configuration;
import org.jooq.Field;
import org.jooq.SQLDialect;
/**
* @author Lukas Eder
@ -65,7 +64,7 @@ class Rpad extends AbstractFunction<String> {
this.field = field;
this.length = length;
this.character = character;
this.character = (character == null ? inline(" ") : character);
}
@Override
@ -74,28 +73,20 @@ class Rpad extends AbstractFunction<String> {
case ASE:
case SQLSERVER:
case SYBASE: {
if (character == null) {
return Factory.concat(field, Factory.repeat(" ", length.sub(Factory.length(field))));
}
else {
return Factory.concat(field, Factory.repeat(character, length.sub(Factory.length(field))));
}
return Factory.concat(field, Factory.repeat(character, length.sub(Factory.length(field))));
}
default: {
// This beautiful expression was contributed by "Ludo", here:
// http://stackoverflow.com/questions/6576343/how-to-simulate-lpad-rpad-with-sqlite
case SQLITE: {
return Factory.field("{0} || replace(replace(substr(quote(zeroblob(({1} + 1) / 2)), 3, ({2} - length({3}))), '''', ''), '0', {4})",
String.class,
field, length, length, field, character);
}
// MySQL only knows the 3 parameter version
if (character == null) {
if (configuration.getDialect() == SQLDialect.MYSQL) {
return function("rpad", SQLDataType.VARCHAR, field, length, val(" "));
}
else {
return function("rpad", SQLDataType.VARCHAR, field, length);
}
}
else {
return function("rpad", SQLDataType.VARCHAR, field, length, character);
}
default: {
return function("rpad", SQLDataType.VARCHAR, field, length, character);
}
}
}