提交 833427f0 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Fix more cases in MySQL compatibility mode

上级 f040590a
...@@ -10,6 +10,7 @@ import java.util.HashSet; ...@@ -10,6 +10,7 @@ import java.util.HashSet;
import org.h2.api.ErrorCode; import org.h2.api.ErrorCode;
import org.h2.command.CommandInterface; import org.h2.command.CommandInterface;
import org.h2.engine.Mode;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.engine.SysProperties; import org.h2.engine.SysProperties;
import org.h2.expression.Expression; import org.h2.expression.Expression;
...@@ -140,9 +141,10 @@ public class SelectUnion extends Query { ...@@ -140,9 +141,10 @@ public class SelectUnion extends Query {
// for the value hash set // for the value hash set
newValues = new Value[columnCount]; newValues = new Value[columnCount];
} }
Mode mode = session.getDatabase().getMode();
for (int i = 0; i < columnCount; i++) { for (int i = 0; i < columnCount; i++) {
Expression e = expressions.get(i); Expression e = expressions.get(i);
newValues[i] = values[i].convertTo(e.getType()); newValues[i] = values[i].convertTo(e.getType(), -1, mode);
} }
return newValues; return newValues;
} }
......
...@@ -410,8 +410,9 @@ public class FunctionAlias extends SchemaObjectBase { ...@@ -410,8 +410,9 @@ public class FunctionAlias extends SchemaObjectBase {
paramClass.getComponentType(), array.length); paramClass.getComponentType(), array.length);
int componentType = DataType.getTypeFromClass( int componentType = DataType.getTypeFromClass(
paramClass.getComponentType()); paramClass.getComponentType());
Mode mode = session.getDatabase().getMode();
for (int i = 0; i < objArray.length; i++) { for (int i = 0; i < objArray.length; i++) {
objArray[i] = array[i].convertTo(componentType).getObject(); objArray[i] = array[i].convertTo(componentType, -1, mode).getObject();
} }
o = objArray; o = objArray;
} else { } else {
......
...@@ -9,6 +9,7 @@ import java.util.ArrayList; ...@@ -9,6 +9,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import org.h2.api.ErrorCode; import org.h2.api.ErrorCode;
import org.h2.engine.Database; import org.h2.engine.Database;
import org.h2.engine.Mode;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.engine.SysProperties; import org.h2.engine.SysProperties;
import org.h2.index.IndexCondition; import org.h2.index.IndexCondition;
...@@ -276,8 +277,9 @@ public class Comparison extends Condition { ...@@ -276,8 +277,9 @@ public class Comparison extends Condition {
l = l.convertToEnum(enumerators); l = l.convertToEnum(enumerators);
r = r.convertToEnum(enumerators); r = r.convertToEnum(enumerators);
} else { } else {
l = l.convertTo(dataType); Mode mode = database.getMode();
r = r.convertTo(dataType); l = l.convertTo(dataType, -1, mode);
r = r.convertTo(dataType, -1, mode);
} }
boolean result = compareNotNull(database, l, r, compareType); boolean result = compareNotNull(database, l, r, compareType);
return ValueBoolean.get(result); return ValueBoolean.get(result);
......
...@@ -53,7 +53,7 @@ public class ConditionIn extends Condition { ...@@ -53,7 +53,7 @@ public class ConditionIn extends Condition {
if (r == ValueNull.INSTANCE) { if (r == ValueNull.INSTANCE) {
hasNull = true; hasNull = true;
} else { } else {
r = r.convertTo(l.getType()); r = r.convertTo(l.getType(), -1, database.getMode());
result = Comparison.compareNotNull(database, l, r, Comparison.EQUAL); result = Comparison.compareNotNull(database, l, r, Comparison.EQUAL);
if (result) { if (result) {
break; break;
......
...@@ -7,6 +7,9 @@ package org.h2.expression; ...@@ -7,6 +7,9 @@ package org.h2.expression;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.TreeSet; import java.util.TreeSet;
import org.h2.engine.Database;
import org.h2.engine.Mode;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.index.IndexCondition; import org.h2.index.IndexCondition;
import org.h2.message.DbException; import org.h2.message.DbException;
...@@ -42,10 +45,12 @@ public class ConditionInConstantSet extends Condition { ...@@ -42,10 +45,12 @@ public class ConditionInConstantSet extends Condition {
ArrayList<Expression> valueList) { ArrayList<Expression> valueList) {
this.left = left; this.left = left;
this.valueList = valueList; this.valueList = valueList;
this.valueSet = new TreeSet<>(session.getDatabase().getCompareMode()); Database database = session.getDatabase();
this.valueSet = new TreeSet<>(database.getCompareMode());
int type = left.getType(); int type = left.getType();
Mode mode = database.getMode();
for (Expression expression : valueList) { for (Expression expression : valueList) {
valueSet.add(expression.getValue(session).convertTo(type)); valueSet.add(expression.getValue(session).convertTo(type, -1, mode));
} }
} }
...@@ -153,7 +158,7 @@ public class ConditionInConstantSet extends Condition { ...@@ -153,7 +158,7 @@ public class ConditionInConstantSet extends Condition {
if (add != null) { if (add != null) {
if (add.isConstant()) { if (add.isConstant()) {
valueList.add(add); valueList.add(add);
valueSet.add(add.getValue(session).convertTo(left.getType())); valueSet.add(add.getValue(session).convertTo(left.getType(), -1, session.getDatabase().getMode()));
return this; return this;
} }
} }
......
...@@ -89,7 +89,7 @@ public class ConditionInParameter extends Condition { ...@@ -89,7 +89,7 @@ public class ConditionInParameter extends Condition {
if (r == ValueNull.INSTANCE) { if (r == ValueNull.INSTANCE) {
hasNull = true; hasNull = true;
} else { } else {
r = r.convertTo(l.getType()); r = r.convertTo(l.getType(), -1, database.getMode());
result = Comparison.compareNotNull(database, l, r, Comparison.EQUAL); result = Comparison.compareNotNull(database, l, r, Comparison.EQUAL);
if (result) { if (result) {
break; break;
...@@ -100,7 +100,7 @@ public class ConditionInParameter extends Condition { ...@@ -100,7 +100,7 @@ public class ConditionInParameter extends Condition {
if (value == ValueNull.INSTANCE) { if (value == ValueNull.INSTANCE) {
hasNull = true; hasNull = true;
} else { } else {
value = value.convertTo(l.getType()); value = value.convertTo(l.getType(), -1, database.getMode());
result = Comparison.compareNotNull(database, l, value, Comparison.EQUAL); result = Comparison.compareNotNull(database, l, value, Comparison.EQUAL);
} }
} }
......
...@@ -53,7 +53,7 @@ public class ConditionInSelect extends Condition { ...@@ -53,7 +53,7 @@ public class ConditionInSelect extends Condition {
} else if (l == ValueNull.INSTANCE) { } else if (l == ValueNull.INSTANCE) {
return l; return l;
} }
if (!session.getDatabase().getSettings().optimizeInSelect) { if (!database.getSettings().optimizeInSelect) {
return getValueSlow(rows, l); return getValueSlow(rows, l);
} }
if (all || (compareType != Comparison.EQUAL && if (all || (compareType != Comparison.EQUAL &&
...@@ -64,7 +64,7 @@ public class ConditionInSelect extends Condition { ...@@ -64,7 +64,7 @@ public class ConditionInSelect extends Condition {
if (dataType == Value.NULL) { if (dataType == Value.NULL) {
return ValueBoolean.FALSE; return ValueBoolean.FALSE;
} }
l = l.convertTo(dataType); l = l.convertTo(dataType, -1, database.getMode());
if (rows.containsDistinct(new Value[] { l })) { if (rows.containsDistinct(new Value[] { l })) {
return ValueBoolean.TRUE; return ValueBoolean.TRUE;
} }
......
...@@ -882,8 +882,8 @@ public class Function extends Expression implements FunctionCall { ...@@ -882,8 +882,8 @@ public class Function extends Expression implements FunctionCall {
break; break;
case CAST: case CAST:
case CONVERT: { case CONVERT: {
v0 = v0.convertTo(dataType);
Mode mode = database.getMode(); Mode mode = database.getMode();
v0 = v0.convertTo(dataType, -1, mode);
v0 = v0.convertScale(mode.convertOnlyToSmallerScale, scale); v0 = v0.convertScale(mode.convertOnlyToSmallerScale, scale);
v0 = v0.convertPrecision(getPrecision(), false); v0 = v0.convertPrecision(getPrecision(), false);
result = v0; result = v0;
...@@ -1078,7 +1078,7 @@ public class Function extends Expression implements FunctionCall { ...@@ -1078,7 +1078,7 @@ public class Function extends Expression implements FunctionCall {
} }
private Value convertResult(Value v) { private Value convertResult(Value v) {
return v.convertTo(dataType); return v.convertTo(dataType, -1, database.getMode());
} }
private static boolean cancelStatement(Session session, int targetSessionId) { private static boolean cancelStatement(Session session, int targetSessionId) {
......
...@@ -109,21 +109,21 @@ public class Operation extends Expression { ...@@ -109,21 +109,21 @@ public class Operation extends Expression {
@Override @Override
public Value getValue(Session session) { public Value getValue(Session session) {
Value l = left.getValue(session).convertTo(dataType); Mode mode = session.getDatabase().getMode();
Value l = left.getValue(session).convertTo(dataType, -1, mode);
Value r; Value r;
if (right == null) { if (right == null) {
r = null; r = null;
} else { } else {
r = right.getValue(session); r = right.getValue(session);
if (convertRight) { if (convertRight) {
r = r.convertTo(dataType); r = r.convertTo(dataType, -1, mode);
} }
} }
switch (opType) { switch (opType) {
case NEGATE: case NEGATE:
return l == ValueNull.INSTANCE ? l : l.negate(); return l == ValueNull.INSTANCE ? l : l.negate();
case CONCAT: { case CONCAT: {
Mode mode = session.getDatabase().getMode();
if (l == ValueNull.INSTANCE) { if (l == ValueNull.INSTANCE) {
if (mode.nullConcatIsNull) { if (mode.nullConcatIsNull) {
return ValueNull.INSTANCE; return ValueNull.INSTANCE;
......
...@@ -77,7 +77,7 @@ public class HashIndex extends BaseIndex { ...@@ -77,7 +77,7 @@ public class HashIndex extends BaseIndex {
* case we need to convert, otherwise the ValueHashMap will not find the * case we need to convert, otherwise the ValueHashMap will not find the
* result. * result.
*/ */
v = v.convertTo(tableData.getColumn(indexColumn).getType()); v = v.convertTo(tableData.getColumn(indexColumn).getType(), -1, database.getMode());
Row result; Row result;
Long pos = rows.get(v); Long pos = rows.get(v);
if (pos == null) { if (pos == null) {
......
...@@ -101,7 +101,7 @@ public class NonUniqueHashIndex extends BaseIndex { ...@@ -101,7 +101,7 @@ public class NonUniqueHashIndex extends BaseIndex {
* case we need to convert, otherwise the ValueHashMap will not find the * case we need to convert, otherwise the ValueHashMap will not find the
* result. * result.
*/ */
v = v.convertTo(tableData.getColumn(indexColumn).getType()); v = v.convertTo(tableData.getColumn(indexColumn).getType(), -1, database.getMode());
ArrayList<Long> positions = rows.get(v); ArrayList<Long> positions = rows.get(v);
return new NonUniqueHashCursor(session, tableData, positions); return new NonUniqueHashCursor(session, tableData, positions);
} }
......
...@@ -562,7 +562,7 @@ public class JdbcPreparedStatement extends JdbcStatement implements ...@@ -562,7 +562,7 @@ public class JdbcPreparedStatement extends JdbcStatement implements
setParameter(parameterIndex, ValueNull.INSTANCE); setParameter(parameterIndex, ValueNull.INSTANCE);
} else { } else {
Value v = DataType.convertToValue(conn.getSession(), x, type); Value v = DataType.convertToValue(conn.getSession(), x, type);
setParameter(parameterIndex, v.convertTo(type)); setParameter(parameterIndex, v.convertTo(type, -1, conn.getMode()));
} }
} catch (Exception e) { } catch (Exception e) {
throw logAndConvert(e); throw logAndConvert(e);
......
...@@ -322,7 +322,7 @@ public final class MVSecondaryIndex extends BaseIndex implements MVIndex { ...@@ -322,7 +322,7 @@ public final class MVSecondaryIndex extends BaseIndex implements MVIndex {
int idx = c.getColumnId(); int idx = c.getColumnId();
Value v = r.getValue(idx); Value v = r.getValue(idx);
if (v != null) { if (v != null) {
array[i] = v.convertTo(c.getType(), -1, null, null, c.getEnumerators()); array[i] = v.convertTo(c.getType(), -1, null, database.getMode(), c.getEnumerators());
} }
} }
array[keyColumns - 1] = ValueLong.get(r.getKey()); array[keyColumns - 1] = ValueLong.get(r.getKey());
......
...@@ -18,6 +18,7 @@ import org.h2.command.dml.AllColumnsForPlan; ...@@ -18,6 +18,7 @@ import org.h2.command.dml.AllColumnsForPlan;
import org.h2.constraint.Constraint; import org.h2.constraint.Constraint;
import org.h2.engine.Constants; import org.h2.engine.Constants;
import org.h2.engine.DbObject; import org.h2.engine.DbObject;
import org.h2.engine.Mode;
import org.h2.engine.Right; import org.h2.engine.Right;
import org.h2.engine.Session; import org.h2.engine.Session;
import org.h2.engine.UndoLogRecord; import org.h2.engine.UndoLogRecord;
...@@ -1214,8 +1215,9 @@ public abstract class Table extends SchemaObjectBase { ...@@ -1214,8 +1215,9 @@ public abstract class Table extends SchemaObjectBase {
a = a.convertToEnum(enumerators); a = a.convertToEnum(enumerators);
b = b.convertToEnum(enumerators); b = b.convertToEnum(enumerators);
} else { } else {
a = a.convertTo(dataType); Mode mode = database.getMode();
b = b.convertTo(dataType); a = a.convertTo(dataType, -1, mode);
b = b.convertTo(dataType, -1, mode);
} }
return a.compareTypeSafe(b, compareMode); return a.compareTypeSafe(b, compareMode);
} }
......
...@@ -325,6 +325,13 @@ public class TestCompatibility extends TestBase { ...@@ -325,6 +325,13 @@ public class TestCompatibility extends TestBase {
prep.setBytes(1, bytes); prep.setBytes(1, bytes);
assertEquals(1, prep.executeUpdate()); assertEquals(1, prep.executeUpdate());
testMySQLBytesCheck(stat, string, bytes); testMySQLBytesCheck(stat, string, bytes);
prep = conn.prepareStatement("SELECT C FROM TEST2 WHERE C = ?");
prep.setBytes(1, bytes);
testMySQLBytesCheck(prep.executeQuery(), string, bytes);
stat.execute("CREATE INDEX TEST2_C ON TEST2(C)");
prep = conn.prepareStatement("SELECT C FROM TEST2 WHERE C = ?");
prep.setBytes(1, bytes);
testMySQLBytesCheck(prep.executeQuery(), string, bytes);
stat.execute("DROP TABLE TEST2"); stat.execute("DROP TABLE TEST2");
if (config.memory) { if (config.memory) {
...@@ -415,8 +422,10 @@ public class TestCompatibility extends TestBase { ...@@ -415,8 +422,10 @@ public class TestCompatibility extends TestBase {
} }
private void testMySQLBytesCheck(Statement stat, String string, byte[] bytes) throws SQLException { private void testMySQLBytesCheck(Statement stat, String string, byte[] bytes) throws SQLException {
ResultSet rs; testMySQLBytesCheck(stat.executeQuery("SELECT C FROM TEST2"), string, bytes);
rs = stat.executeQuery("SELECT C FROM TEST2"); }
private void testMySQLBytesCheck(ResultSet rs, String string, byte[] bytes) throws SQLException {
assertTrue(rs.next()); assertTrue(rs.next());
assertEquals(string, rs.getString(1)); assertEquals(string, rs.getString(1));
assertEquals(bytes, rs.getBytes(1)); assertEquals(bytes, rs.getBytes(1));
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论