diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/FunctionTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/FunctionTests.java index fb1d95e352..0dbad7f7cc 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/FunctionTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/FunctionTests.java @@ -483,7 +483,6 @@ extends BaseTest rpad(Field field, int length) { return rpad(nullSafe(field), val(length)); } @@ -2667,7 +2667,7 @@ public class Factory implements FactoryOperations { * well, depending on the RDBMS: *
concat([field], repeat(' ', [length] - length([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 rpad(Field field, Field 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 rpad(Field 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 rpad(Field 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: *
concat([field], repeat([character], [length] - length([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 rpad(Field field, Field length, Field 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 lpad(Field field, int length) { return lpad(nullSafe(field), val(length)); } @@ -2725,7 +2725,7 @@ public class Factory implements FactoryOperations { * well, depending on the RDBMS: *
concat(repeat(' ', [length] - length([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 lpad(Field field, Field 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 lpad(Field 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 lpad(Field 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: *
concat(repeat([character], [length] - length([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 lpad(Field field, Field length, Field character) { return new Lpad(nullSafe(field), nullSafe(length), nullSafe(character)); } diff --git a/jOOQ/src/main/java/org/jooq/impl/Lpad.java b/jOOQ/src/main/java/org/jooq/impl/Lpad.java index dd8aae071d..d24921c353 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Lpad.java +++ b/jOOQ/src/main/java/org/jooq/impl/Lpad.java @@ -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 { this.field = field; this.length = length; - this.character = character; + this.character = (character == null ? inline(" ") : character); } @Override @@ -74,28 +73,19 @@ class Lpad extends AbstractFunction { 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); } } } diff --git a/jOOQ/src/main/java/org/jooq/impl/Rpad.java b/jOOQ/src/main/java/org/jooq/impl/Rpad.java index 441ffcc859..2b97e1afdd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Rpad.java +++ b/jOOQ/src/main/java/org/jooq/impl/Rpad.java @@ -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 { this.field = field; this.length = length; - this.character = character; + this.character = (character == null ? inline(" ") : character); } @Override @@ -74,28 +73,20 @@ class Rpad extends AbstractFunction { 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); } } }