[#727] Simulate RPAD and LPAD in SQLite
This commit is contained in:
parent
723bff2419
commit
12e6e295c6
@ -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;
|
||||
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user