ExpressionOp.java (hsqldb-2.6.0) | : | ExpressionOp.java (hsqldb-2.6.1) | ||
---|---|---|---|---|
skipping to change at line 51 | skipping to change at line 51 | |||
import org.hsqldb.types.DateTimeType; | import org.hsqldb.types.DateTimeType; | |||
import org.hsqldb.types.IntervalType; | import org.hsqldb.types.IntervalType; | |||
import org.hsqldb.types.Type; | import org.hsqldb.types.Type; | |||
import org.hsqldb.types.Types; | import org.hsqldb.types.Types; | |||
/** | /** | |||
* Implementation of CAST, CASE, LIMIT and ZONE operations. | * Implementation of CAST, CASE, LIMIT and ZONE operations. | |||
* | * | |||
* @author Campbell Burnet (campbell-burnet@users dot sourceforge.net) | * @author Campbell Burnet (campbell-burnet@users dot sourceforge.net) | |||
* @author Fred Toussi (fredt@users dot sourceforge.net) | * @author Fred Toussi (fredt@users dot sourceforge.net) | |||
* @version 2.5.1 | * @version 2.6.1 | |||
* @since 1.9.0 | * @since 1.9.0 | |||
*/ | */ | |||
public class ExpressionOp extends Expression { | public class ExpressionOp extends Expression { | |||
static final ExpressionOp limitOneExpression = new ExpressionOp( | static final ExpressionOp limitOneExpression = new ExpressionOp( | |||
OpTypes.LIMIT, | OpTypes.LIMIT, | |||
new ExpressionValue(ValuePool.INTEGER_0, Type.SQL_INTEGER), | new ExpressionValue(ValuePool.INTEGER_0, Type.SQL_INTEGER), | |||
new ExpressionValue(ValuePool.INTEGER_1, Type.SQL_INTEGER)); | new ExpressionValue(ValuePool.INTEGER_1, Type.SQL_INTEGER)); | |||
/** | /** | |||
skipping to change at line 200 | skipping to change at line 200 | |||
if (e.getType() == OpTypes.VALUE) { | if (e.getType() == OpTypes.VALUE) { | |||
Object value = dataType.castToType(session, e.getValue(session), | Object value = dataType.castToType(session, e.getValue(session), | |||
e.getDataType()); | e.getDataType()); | |||
return new ExpressionValue(value, dataType); | return new ExpressionValue(value, dataType); | |||
} | } | |||
return new ExpressionOp(e, dataType); | return new ExpressionOp(e, dataType); | |||
} | } | |||
public static Expression getConvertExpression(Session session, | ||||
Expression e, Type dataType) { | ||||
if (e.getType() == OpTypes.VALUE) { | ||||
Object value = dataType.convertToType(session, | ||||
e.getValue(session), | ||||
e.getDataType()); | ||||
return new ExpressionValue(value, dataType); | ||||
} | ||||
Expression c = new ExpressionOp(e, dataType); | ||||
c.opType = OpTypes.CONVERT; | ||||
return c; | ||||
} | ||||
public String getSQL() { | public String getSQL() { | |||
StringBuilder sb = new StringBuilder(64); | StringBuilder sb = new StringBuilder(64); | |||
String left = getContextSQL(nodes.length > 0 ? nodes[LEFT] | String left = getContextSQL(nodes.length > 0 ? nodes[LEFT] | |||
: null); | : null); | |||
String right = getContextSQL(nodes.length > 1 ? nodes[RIGHT] | String right = getContextSQL(nodes.length > 1 ? nodes[RIGHT] | |||
: null); | : null); | |||
switch (opType) { | switch (opType) { | |||
skipping to change at line 234 | skipping to change at line 252 | |||
sb.append(left).append(' ').append(right).append(' '); | sb.append(left).append(' ').append(right).append(' '); | |||
break; | break; | |||
case OpTypes.CAST : | case OpTypes.CAST : | |||
sb.append(' ').append(Tokens.T_CAST).append('('); | sb.append(' ').append(Tokens.T_CAST).append('('); | |||
sb.append(left).append(' ').append(Tokens.T_AS).append(' '); | sb.append(left).append(' ').append(Tokens.T_AS).append(' '); | |||
sb.append(dataType.getTypeDefinition()); | sb.append(dataType.getTypeDefinition()); | |||
sb.append(')'); | sb.append(')'); | |||
break; | break; | |||
case OpTypes.CONVERT : | ||||
sb.append(left); | ||||
break; | ||||
case OpTypes.CASEWHEN : | case OpTypes.CASEWHEN : | |||
sb.append(' ').append(Tokens.T_CASEWHEN).append('('); | sb.append(' ').append(Tokens.T_CASEWHEN).append('('); | |||
sb.append(left).append(',').append(right).append(')'); | sb.append(left).append(',').append(right).append(')'); | |||
break; | break; | |||
case OpTypes.ALTERNATIVE : | case OpTypes.ALTERNATIVE : | |||
sb.append(left).append(',').append(right); | sb.append(left).append(',').append(right); | |||
break; | break; | |||
case OpTypes.LIMIT : | case OpTypes.LIMIT : | |||
skipping to change at line 331 | skipping to change at line 353 | |||
} | } | |||
return sb.toString(); | return sb.toString(); | |||
case OpTypes.CAST : | case OpTypes.CAST : | |||
sb.append(Tokens.T_CAST).append(' '); | sb.append(Tokens.T_CAST).append(' '); | |||
sb.append(dataType.getTypeDefinition()); | sb.append(dataType.getTypeDefinition()); | |||
sb.append(' '); | sb.append(' '); | |||
break; | break; | |||
case OpTypes.CONVERT : | ||||
sb.append(Tokens.T_CONVERT).append(' '); | ||||
sb.append(dataType.getTypeDefinition()); | ||||
sb.append(' '); | ||||
break; | ||||
case OpTypes.CASEWHEN : | case OpTypes.CASEWHEN : | |||
sb.append(Tokens.T_CASEWHEN).append(' '); | sb.append(Tokens.T_CASEWHEN).append(' '); | |||
break; | break; | |||
case OpTypes.CONCAT_WS : | case OpTypes.CONCAT_WS : | |||
sb.append(Tokens.T_CONCAT_WS).append(' '); | sb.append(Tokens.T_CONCAT_WS).append(' '); | |||
break; | break; | |||
default : | default : | |||
} | } | |||
skipping to change at line 358 | skipping to change at line 386 | |||
if (getRightNode() != null) { | if (getRightNode() != null) { | |||
sb.append(" arg_right=["); | sb.append(" arg_right=["); | |||
sb.append(nodes[RIGHT].describe(session, blanks + 1)); | sb.append(nodes[RIGHT].describe(session, blanks + 1)); | |||
sb.append(']'); | sb.append(']'); | |||
} | } | |||
return sb.toString(); | return sb.toString(); | |||
} | } | |||
public List resolveColumnReferences(Session session, | public List resolveColumnReferences(Session session, | |||
RangeGroup rangeGroup, int rangeCount, RangeGroup[] rangeGroups, | RangeGroup rangeGroup, int rangeCount, | |||
List unresolvedSet, boolean acceptsSequences) { | RangeGroup[] rangeGroups, | |||
List unresolvedSet, | ||||
boolean acceptsSequences) { | ||||
if (opType == OpTypes.VALUE) { | if (opType == OpTypes.VALUE) { | |||
return unresolvedSet; | return unresolvedSet; | |||
} | } | |||
switch (opType) { | switch (opType) { | |||
case OpTypes.CASEWHEN : | case OpTypes.CASEWHEN : | |||
acceptsSequences = false; | acceptsSequences = false; | |||
break; | break; | |||
skipping to change at line 420 | skipping to change at line 450 | |||
if (nodes[LEFT].opType == OpTypes.VALUE | if (nodes[LEFT].opType == OpTypes.VALUE | |||
&& (nodes[RIGHT] == null | && (nodes[RIGHT] == null | |||
|| nodes[RIGHT].opType == OpTypes.VALUE)) { | || nodes[RIGHT].opType == OpTypes.VALUE)) { | |||
setAsConstantValue(session, parent); | setAsConstantValue(session, parent); | |||
break; | break; | |||
} | } | |||
break; | break; | |||
} | } | |||
case OpTypes.CAST : { | case OpTypes.CAST : | |||
case OpTypes.CONVERT : { | ||||
Expression node = nodes[LEFT]; | Expression node = nodes[LEFT]; | |||
Type nodeType = node.dataType; | Type nodeType = node.dataType; | |||
if (nodeType != null && !dataType.canConvertFrom(nodeType)) { | if (nodeType != null && !dataType.canConvertFrom(nodeType)) { | |||
throw Error.error(ErrorCode.X_42561); | throw Error.error(ErrorCode.X_42561); | |||
} | } | |||
if (node.opType == OpTypes.VALUE) { | if (node.opType == OpTypes.VALUE) { | |||
setAsConstantValue(session, parent); | setAsConstantValue(session, parent); | |||
} else if (nodes[LEFT].opType == OpTypes.DYNAMIC_PARAM) { | } else if (nodes[LEFT].opType == OpTypes.DYNAMIC_PARAM) { | |||
skipping to change at line 561 | skipping to change at line 592 | |||
if (exprSubType == OpTypes.CAST) { | if (exprSubType == OpTypes.CAST) { | |||
if (nodes[RIGHT].dataType == null) { | if (nodes[RIGHT].dataType == null) { | |||
nodes[RIGHT].dataType = nodes[LEFT].dataType = | nodes[RIGHT].dataType = nodes[LEFT].dataType = | |||
Type.SQL_VARCHAR_DEFAULT; | Type.SQL_VARCHAR_DEFAULT; | |||
} | } | |||
dataType = nodes[RIGHT].dataType; | dataType = nodes[RIGHT].dataType; | |||
if (!nodes[RIGHT].dataType.equals(nodes[LEFT].dataType)) { | if (!nodes[RIGHT].dataType.equals(nodes[LEFT].dataType)) { | |||
if (dataType.isCharacterType()) { | ||||
dataType = Type.SQL_VARCHAR_DEFAULT; | ||||
} | ||||
nodes[LEFT] = new ExpressionOp(nodes[LEFT], dataType); | nodes[LEFT] = new ExpressionOp(nodes[LEFT], dataType); | |||
} | } | |||
} else { | } else { | |||
dataType = Type.getAggregateType(nodes[LEFT].dataType, dataType); | dataType = Type.getAggregateType(nodes[LEFT].dataType, dataType); | |||
dataType = Type.getAggregateType(nodes[RIGHT].dataType, dataType); | dataType = Type.getAggregateType(nodes[RIGHT].dataType, dataType); | |||
} | } | |||
} | } | |||
/** | /** | |||
* For CASE WHEN and its special cases section 9.3 of the SQL standard | * For CASE WHEN and its special cases section 9.3 of the SQL standard | |||
skipping to change at line 865 | skipping to change at line 900 | |||
if (dataType.userTypeModifier != null) { | if (dataType.userTypeModifier != null) { | |||
Constraint[] constraints = | Constraint[] constraints = | |||
dataType.userTypeModifier.getConstraints(); | dataType.userTypeModifier.getConstraints(); | |||
for (int i = 0; i < constraints.length; i++) { | for (int i = 0; i < constraints.length; i++) { | |||
constraints[i].checkCheckConstraint(session, null, | constraints[i].checkCheckConstraint(session, null, | |||
null, value); | null, value); | |||
} | } | |||
} | } | |||
return value; | ||||
} | ||||
case OpTypes.CONVERT : { | ||||
Object value = | ||||
dataType.convertToType(session, | ||||
nodes[LEFT].getValue(session), | ||||
nodes[LEFT].dataType); | ||||
if (dataType.userTypeModifier != null) { | ||||
Constraint[] constraints = | ||||
dataType.userTypeModifier.getConstraints(); | ||||
for (int i = 0; i < constraints.length; i++) { | ||||
constraints[i].checkCheckConstraint(session, null, | ||||
null, value); | ||||
} | ||||
} | ||||
return value; | return value; | |||
} | } | |||
case OpTypes.CASEWHEN : { | case OpTypes.CASEWHEN : { | |||
Boolean result = (Boolean) nodes[LEFT].getValue(session); | Boolean result = (Boolean) nodes[LEFT].getValue(session); | |||
if (Boolean.TRUE.equals(result)) { | if (Boolean.TRUE.equals(result)) { | |||
return nodes[RIGHT].nodes[LEFT].getValue(session, | return nodes[RIGHT].nodes[LEFT].getValue(session, | |||
dataType); | dataType); | |||
} else { | } else { | |||
End of changes. 8 change blocks. | ||||
4 lines changed or deleted | 57 lines changed or added |