"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "hsqldb/src/org/hsqldb/ExpressionOp.java" between
hsqldb-2.6.0.zip and hsqldb-2.6.1.zip

About: HSQLDB (HyperSQL DataBase) is a SQL relational database engine written in Java. It supports nearly full ANSI-92 SQL (BNF format) and full core SQL:2008.

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

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)