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