diff --git a/jsql/src/main/java/org/jaxdb/jsql/ComparisonPredicate.java b/jsql/src/main/java/org/jaxdb/jsql/ComparisonPredicate.java index 9bbb2adc..a16677b9 100644 --- a/jsql/src/main/java/org/jaxdb/jsql/ComparisonPredicate.java +++ b/jsql/src/main/java/org/jaxdb/jsql/ComparisonPredicate.java @@ -62,7 +62,7 @@ static class Eq extends LogicalPredicate { @Override final StringBuilder compile(final Compiler compiler, final StringBuilder b, final boolean isForUpdateWhere) { - return b.append('='); + return b.append(this.b == null ? "IS" : "="); } } @@ -85,7 +85,7 @@ static class Ne extends LogicalPredicate { @Override final StringBuilder compile(final Compiler compiler, final StringBuilder b, final boolean isForUpdateWhere) { - return b.append("!="); + return b.append(this.b == null ? "IS NOT" : "!="); } } @@ -108,6 +108,7 @@ static class Gt extends LogicalPredicate { @Override final StringBuilder compile(final Compiler compiler, final StringBuilder b, final boolean isForUpdateWhere) { + super.compile(compiler, b, isForUpdateWhere); return b.append('>'); } } @@ -131,6 +132,7 @@ static class Lt extends LogicalPredicate { @Override final StringBuilder compile(final Compiler compiler, final StringBuilder b, final boolean isForUpdateWhere) { + super.compile(compiler, b, isForUpdateWhere); return b.append('<'); } } @@ -154,6 +156,7 @@ static class Gte extends LogicalPredicate { @Override final StringBuilder compile(final Compiler compiler, final StringBuilder b, final boolean isForUpdateWhere) { + super.compile(compiler, b, isForUpdateWhere); return b.append(">="); } } @@ -177,6 +180,7 @@ static class Lte extends LogicalPredicate { @Override final StringBuilder compile(final Compiler compiler, final StringBuilder b, final boolean isForUpdateWhere) { + super.compile(compiler, b, isForUpdateWhere); return b.append("<="); } } @@ -184,7 +188,7 @@ final StringBuilder compile(final Compiler compiler, final StringBuilder b, fina private ComparisonPredicate(final type.Column a, final V b) { super(((Subject)a).getTable()); this.a = (Subject)a; - this.b = org.jaxdb.jsql.data.wrap(b); + this.b = b == null ? null : org.jaxdb.jsql.data.wrap(b); } private ComparisonPredicate(final type.Column a, final QuantifiedComparisonPredicate b) { @@ -195,7 +199,7 @@ private ComparisonPredicate(final type.Column a, final QuantifiedComparisonPr private ComparisonPredicate(final V a, final type.Column b) { super(((Subject)b).getTable()); - this.a = org.jaxdb.jsql.data.wrap(a); + this.a = a == null ? null : org.jaxdb.jsql.data.wrap(a); this.b = (Subject)b; } @@ -221,4 +225,12 @@ final void collectColumns(final ArrayList> list) { collectColumn(list, a); collectColumn(list, b); } + + @Override + StringBuilder compile(final Compiler compiler, final StringBuilder b, final boolean isForUpdateWhere) { + if (b == null) + throw new IllegalArgumentException("NULL is not allowed for " + this.getClass().getSimpleName()); + + return null; + } } \ No newline at end of file diff --git a/jsql/src/main/java/org/jaxdb/jsql/Compiler.java b/jsql/src/main/java/org/jaxdb/jsql/Compiler.java index 39498fa7..b751039b 100644 --- a/jsql/src/main/java/org/jaxdb/jsql/Compiler.java +++ b/jsql/src/main/java/org/jaxdb/jsql/Compiler.java @@ -811,6 +811,9 @@ void compilePredicate(final ComparisonPredicate predicate, final Compilation unwrapAlias(predicate.a).compile(compilation, true); sql.append(')'); } + else if (predicate.a == null) { + throw new IllegalArgumentException("lhs is NULL"); + } else { unwrapAlias(predicate.a).compile(compilation, true); } @@ -835,6 +838,9 @@ void compilePredicate(final ComparisonPredicate predicate, final Compilation unwrapAlias(predicate.b).compile(compilation, true); sql.append(')'); } + else if (predicate.b == null) { + compilation.sql.append("NULL"); + } else { unwrapAlias(predicate.b).compile(compilation, true); } diff --git a/jsql/src/main/java/org/jaxdb/jsql/PostgreSQLCompiler.java b/jsql/src/main/java/org/jaxdb/jsql/PostgreSQLCompiler.java index ba070944..aa6b0b24 100644 --- a/jsql/src/main/java/org/jaxdb/jsql/PostgreSQLCompiler.java +++ b/jsql/src/main/java/org/jaxdb/jsql/PostgreSQLCompiler.java @@ -270,12 +270,14 @@ private static void toChar(final data.ENUM column, final Compilation compilat final void compilePredicate(final ComparisonPredicate predicate, final Compilation compilation) throws IOException, SQLException { final Subject a = predicate.a; final Subject b = predicate.b; - if (a.getClass() == b.getClass() || (!(a instanceof data.ENUM) && !(b instanceof data.ENUM))) { + if (!(a instanceof data.ENUM) && !(b instanceof data.ENUM) || (a != null && b != null && a.getClass() == b.getClass())) { super.compilePredicate(predicate, compilation); } else { if (a instanceof data.ENUM) toChar((data.ENUM)a, compilation); + else if (a == null) + compilation.sql.append("NULL"); else a.compile(compilation, true); @@ -285,6 +287,8 @@ final void compilePredicate(final ComparisonPredicate predicate, final Compil sql.append(' '); if (b instanceof data.ENUM) toChar((data.ENUM)b, compilation); + else if (b == null) + compilation.sql.append("NULL"); else b.compile(compilation, true); }