提交 d46b2da5 authored 作者: Thomas Mueller's avatar Thomas Mueller

NOT IN(SELECT ...) was incorrect if the subquery returns no rows.

上级 b1a3cf48
...@@ -44,6 +44,9 @@ public class ConditionIn extends Condition { ...@@ -44,6 +44,9 @@ public class ConditionIn extends Condition {
public Value getValue(Session session) throws SQLException { public Value getValue(Session session) throws SQLException {
Value l = left.getValue(session); Value l = left.getValue(session);
if (values.size() == 0) {
return ValueBoolean.get(false);
}
if (l == ValueNull.INSTANCE) { if (l == ValueNull.INSTANCE) {
return l; return l;
} }
...@@ -77,6 +80,9 @@ public class ConditionIn extends Condition { ...@@ -77,6 +80,9 @@ public class ConditionIn extends Condition {
} }
public Expression optimize(Session session) throws SQLException { public Expression optimize(Session session) throws SQLException {
if (values.size() == 0) {
return ValueExpression.get(ValueBoolean.get(false));
}
left = left.optimize(session); left = left.optimize(session);
boolean constant = left.isConstant(); boolean constant = left.isConstant();
if (constant && left == ValueExpression.NULL) { if (constant && left == ValueExpression.NULL) {
......
...@@ -42,16 +42,20 @@ public class ConditionInSelect extends Condition { ...@@ -42,16 +42,20 @@ public class ConditionInSelect extends Condition {
} }
public Value getValue(Session session) throws SQLException { public Value getValue(Session session) throws SQLException {
Value l = left.getValue(session);
if (l == ValueNull.INSTANCE) {
return l;
}
query.setSession(session); query.setSession(session);
LocalResult rows = query.query(0); LocalResult rows = query.query(0);
session.addTemporaryResult(rows); session.addTemporaryResult(rows);
boolean hasNull = false; boolean hasNull = false;
boolean result = all; boolean result = all;
Value l = left.getValue(session);
boolean hasRow = false;
while (rows.next()) { while (rows.next()) {
if (!hasRow) {
if (l == ValueNull.INSTANCE) {
return l;
}
hasRow = true;
}
boolean value; boolean value;
Value r = rows.currentRow()[0]; Value r = rows.currentRow()[0];
if (r == ValueNull.INSTANCE) { if (r == ValueNull.INSTANCE) {
...@@ -68,6 +72,9 @@ public class ConditionInSelect extends Condition { ...@@ -68,6 +72,9 @@ public class ConditionInSelect extends Condition {
break; break;
} }
} }
if (!hasRow) {
return ValueBoolean.get(false);
}
if (!result && hasNull) { if (!result && hasNull) {
return ValueNull.INSTANCE; return ValueNull.INSTANCE;
} }
...@@ -82,9 +89,6 @@ public class ConditionInSelect extends Condition { ...@@ -82,9 +89,6 @@ public class ConditionInSelect extends Condition {
public Expression optimize(Session session) throws SQLException { public Expression optimize(Session session) throws SQLException {
left = left.optimize(session); left = left.optimize(session);
if (left == ValueExpression.NULL) {
return left;
}
query.prepare(); query.prepare();
if (query.getColumnCount() != 1) { if (query.getColumnCount() != 1) {
throw Message.getSQLException(ErrorCode.SUBQUERY_IS_NOT_SINGLE_COLUMN); throw Message.getSQLException(ErrorCode.SUBQUERY_IS_NOT_SINGLE_COLUMN);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论