Skip to content
This repository was archived by the owner on May 12, 2021. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,9 @@ public static enum ConfVars {
TAJO_DEBUG("tajo.debug", false),

// ONLY FOR TESTCASE
TESTCASE_MIN_TASK_NUM("tajo.testcase.min.task.num", -1)
TESTCASE_MIN_TASK_NUM("tajo.testcase.min.task.num", -1),

ABORT_DIVIDE_BY_ZERO("tajo.abort.dividebyzero", false);
;

public final String varname;
Expand Down
72 changes: 72 additions & 0 deletions tajo-common/src/main/java/org/apache/tajo/datum/Datum.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
package org.apache.tajo.datum;

import com.google.gson.annotations.Expose;
import org.apache.tajo.conf.TajoConf;
import org.apache.tajo.conf.TajoConf.ConfVars;
import org.apache.tajo.exception.InvalidCastException;
import org.apache.tajo.exception.InvalidOperationException;
import org.apache.tajo.json.CommonGsonHelper;
Expand All @@ -27,6 +29,12 @@
import static org.apache.tajo.common.TajoDataTypes.Type;

public abstract class Datum implements Comparable<Datum>, GsonObject {
static boolean abortWhenDivideByZero;

static {
initAbortWhenDivideByZero(new TajoConf());
}

@Expose private final Type type;

public Datum(Type type) {
Expand Down Expand Up @@ -105,6 +113,10 @@ public boolean isReal() {
this.type == Type.FLOAT8;
}

protected static void initAbortWhenDivideByZero(TajoConf tajoConf) {
abortWhenDivideByZero = tajoConf.getBoolVar(ConfVars.ABORT_DIVIDE_BY_ZERO);
}

public abstract int size();

public Datum and(Datum datum) {
Expand Down Expand Up @@ -190,4 +202,64 @@ public String toJson() {
public String toString() {
return asChars();
}

protected boolean validateDivideZero(short value) {
if (value == (short)0) {
if (abortWhenDivideByZero) {
throw new ArithmeticException("/ by zero");
} else {
return false;
}
} else {
return true;
}
}

protected boolean validateDivideZero(int value) {
if (value == 0) {
if (abortWhenDivideByZero) {
throw new ArithmeticException("/ by zero");
} else {
return false;
}
} else {
return true;
}
}

protected boolean validateDivideZero(long value) {
if (value == 0L) {
if (abortWhenDivideByZero) {
throw new ArithmeticException("/ by zero");
} else {
return false;
}
} else {
return true;
}
}

protected boolean validateDivideZero(float value) {
if (value == 0.0f) {
if (abortWhenDivideByZero) {
throw new ArithmeticException("/ by zero");
} else {
return false;
}
} else {
return true;
}
}

protected boolean validateDivideZero(double value) {
if (value == 0.0) {
if (abortWhenDivideByZero) {
throw new ArithmeticException("/ by zero");
} else {
return false;
}
} else {
return true;
}
}
}
60 changes: 50 additions & 10 deletions tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java
Original file line number Diff line number Diff line change
Expand Up @@ -277,15 +277,35 @@ public Datum multiply(Datum datum) {
public Datum divide(Datum datum) {
switch (datum.type()) {
case INT2:
return DatumFactory.createFloat4(val / datum.asInt2());
short paramValueI2 = datum.asInt2();
if (!validateDivideZero(paramValueI2)) {
return NullDatum.get();
}
return DatumFactory.createFloat4(val / paramValueI2);
case INT4:
return DatumFactory.createFloat4(val / datum.asInt4());
int paramValueI4 = datum.asInt4();
if (!validateDivideZero(paramValueI4)) {
return NullDatum.get();
}
return DatumFactory.createFloat4(val / paramValueI4);
case INT8:
return DatumFactory.createFloat4(val / datum.asInt8());
long paramValueI8 = datum.asInt8();
if (!validateDivideZero(paramValueI8)) {
return NullDatum.get();
}
return DatumFactory.createFloat4(val / paramValueI8);
case FLOAT4:
return DatumFactory.createFloat4(val / datum.asFloat4());
float paramValueF4 = datum.asFloat4();
if (!validateDivideZero(paramValueF4)) {
return NullDatum.get();
}
return DatumFactory.createFloat4(val / paramValueF4);
case FLOAT8:
return DatumFactory.createFloat8(val / datum.asFloat8());
double paramValueF8 = datum.asFloat8();
if (!validateDivideZero(paramValueF8)) {
return NullDatum.get();
}
return DatumFactory.createFloat8(val / paramValueF8);
case NULL_TYPE:
return datum;
default:
Expand All @@ -297,15 +317,35 @@ public Datum divide(Datum datum) {
public Datum modular(Datum datum) {
switch (datum.type()) {
case INT2:
return DatumFactory.createFloat4(val % datum.asInt2());
short paramValueI2 = datum.asInt2();
if (!validateDivideZero(paramValueI2)) {
return NullDatum.get();
}
return DatumFactory.createFloat4(val % paramValueI2);
case INT4:
return DatumFactory.createFloat4(val % datum.asInt4());
int paramValueI4 = datum.asInt4();
if (!validateDivideZero(paramValueI4)) {
return NullDatum.get();
}
return DatumFactory.createFloat4(val % paramValueI4);
case INT8:
return DatumFactory.createFloat4(val % datum.asInt8());
long paramValueI8 = datum.asInt8();
if (!validateDivideZero(paramValueI8)) {
return NullDatum.get();
}
return DatumFactory.createFloat4(val % paramValueI8);
case FLOAT4:
return DatumFactory.createFloat4(val % datum.asFloat4());
float paramValueF4 = datum.asFloat4();
if (!validateDivideZero(paramValueF4)) {
return NullDatum.get();
}
return DatumFactory.createFloat4(val % paramValueF4);
case FLOAT8:
return DatumFactory.createFloat8(val % datum.asFloat8());
double paramValueF8 = datum.asFloat8();
if (!validateDivideZero(paramValueF8)) {
return NullDatum.get();
}
return DatumFactory.createFloat8(val % paramValueF8);
case NULL_TYPE:
return datum;
default:
Expand Down
78 changes: 59 additions & 19 deletions tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
Original file line number Diff line number Diff line change
Expand Up @@ -265,36 +265,76 @@ public Datum multiply(Datum datum) {
@Override
public Datum divide(Datum datum) {
switch (datum.type()) {
case INT2:
return DatumFactory.createFloat8(val / datum.asInt2());
case INT4:
return DatumFactory.createFloat8(val / datum.asInt4());
case INT8:
return DatumFactory.createFloat8(val / datum.asInt8());
case FLOAT4:
return DatumFactory.createFloat8(val / datum.asFloat4());
case FLOAT8:
return DatumFactory.createFloat8(val / datum.asFloat8());
case NULL_TYPE:
return datum;
default:
throw new InvalidOperationException(datum.type());
case INT2:
short paramValueI2 = datum.asInt2();
if (!validateDivideZero(paramValueI2)) {
return NullDatum.get();
}
return DatumFactory.createFloat8(val / paramValueI2);
case INT4:
int paramValueI4 = datum.asInt4();
if (!validateDivideZero(paramValueI4)) {
return NullDatum.get();
}
return DatumFactory.createFloat8(val / paramValueI4);
case INT8:
long paramValueI8 = datum.asInt8();
if (!validateDivideZero(paramValueI8)) {
return NullDatum.get();
}
return DatumFactory.createFloat8(val / paramValueI8);
case FLOAT4:
float paramValueF4 = datum.asFloat4();
if (!validateDivideZero(paramValueF4)) {
return NullDatum.get();
}
return DatumFactory.createFloat8(val / paramValueF4);
case FLOAT8:
double paramValueF8 = datum.asFloat8();
if (!validateDivideZero(paramValueF8)) {
return NullDatum.get();
}
return DatumFactory.createFloat8(val / paramValueF8);
case NULL_TYPE:
return datum;
default:
throw new InvalidOperationException(datum.type());
}
}

@Override
public Datum modular(Datum datum) {
switch (datum.type()) {
case INT2:
return DatumFactory.createFloat8(val % datum.asInt2());
short paramValueI2 = datum.asInt2();
if (!validateDivideZero(paramValueI2)) {
return NullDatum.get();
}
return DatumFactory.createFloat8(val % paramValueI2);
case INT4:
return DatumFactory.createFloat8(val % datum.asInt4());
int paramValueI4 = datum.asInt4();
if (!validateDivideZero(paramValueI4)) {
return NullDatum.get();
}
return DatumFactory.createFloat8(val % paramValueI4);
case INT8:
return DatumFactory.createFloat8(val % datum.asInt8());
long paramValueI8 = datum.asInt8();
if (!validateDivideZero(paramValueI8)) {
return NullDatum.get();
}
return DatumFactory.createFloat8(val % paramValueI8);
case FLOAT4:
return DatumFactory.createFloat8(val % datum.asFloat4());
float paramValueF4 = datum.asFloat4();
if (!validateDivideZero(paramValueF4)) {
return NullDatum.get();
}
return DatumFactory.createFloat8(val % paramValueF4);
case FLOAT8:
return DatumFactory.createFloat8(val % datum.asFloat8());
double paramValueF8 = datum.asFloat8();
if (!validateDivideZero(paramValueF8)) {
return NullDatum.get();
}
return DatumFactory.createFloat8(val % paramValueF8);
case NULL_TYPE:
return datum;
default:
Expand Down
76 changes: 58 additions & 18 deletions tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java
Original file line number Diff line number Diff line change
Expand Up @@ -267,35 +267,75 @@ public Datum multiply(Datum datum) {
@Override
public Datum divide(Datum datum) {
switch (datum.type()) {
case INT2:
return DatumFactory.createInt2((short) (val / datum.asInt2()));
case INT4:
return DatumFactory.createInt4(val / datum.asInt4());
case INT8:
return DatumFactory.createInt8(val / datum.asInt8());
case FLOAT4:
return DatumFactory.createFloat4(val / datum.asFloat4());
case FLOAT8:
return DatumFactory.createFloat8(val / datum.asFloat8());
case NULL_TYPE:
return datum;
default:
throw new InvalidOperationException(datum.type());
case INT2:
short paramValueI2 = datum.asInt2();
if (!validateDivideZero(paramValueI2)) {
return NullDatum.get();
}
return DatumFactory.createInt2((short) (val / paramValueI2));
case INT4:
int paramValueI4 = datum.asInt4();
if (!validateDivideZero(paramValueI4)) {
return NullDatum.get();
}
return DatumFactory.createInt4(val / paramValueI4);
case INT8:
long paramValueI8 = datum.asInt8();
if (!validateDivideZero(paramValueI8)) {
return NullDatum.get();
}
return DatumFactory.createInt8(val / paramValueI8);
case FLOAT4:
float paramValueF4 = datum.asFloat4();
if (!validateDivideZero(paramValueF4)) {
return NullDatum.get();
}
return DatumFactory.createFloat4(val / paramValueF4);
case FLOAT8:
double paramValueF8 = datum.asFloat8();
if (!validateDivideZero(paramValueF8)) {
return NullDatum.get();
}
return DatumFactory.createFloat8(val / paramValueF8);
case NULL_TYPE:
return datum;
default:
throw new InvalidOperationException(datum.type());
}
}

@Override
public Datum modular(Datum datum) {
switch (datum.type()) {
case INT2:
return DatumFactory.createInt2((short) (val % datum.asInt2()));
short paramValueI2 = datum.asInt2();
if (!validateDivideZero(paramValueI2)) {
return NullDatum.get();
}
return DatumFactory.createInt2((short) (val % paramValueI2));
case INT4:
return DatumFactory.createInt4(val % datum.asInt4());
int paramValueI4 = datum.asInt4();
if (!validateDivideZero(paramValueI4)) {
return NullDatum.get();
}
return DatumFactory.createInt4(val % paramValueI4);
case INT8:
return DatumFactory.createInt8(val % datum.asInt8());
long paramValueI8 = datum.asInt8();
if (!validateDivideZero(paramValueI8)) {
return NullDatum.get();
}
return DatumFactory.createInt8(val % paramValueI8);
case FLOAT4:
return DatumFactory.createFloat4(val % datum.asFloat4());
float paramValueF4 = datum.asFloat4();
if (!validateDivideZero(paramValueF4)) {
return NullDatum.get();
}
return DatumFactory.createFloat4(val % paramValueF4);
case FLOAT8:
double paramValueF8 = datum.asFloat8();
if (!validateDivideZero(paramValueF8)) {
return NullDatum.get();
}
return DatumFactory.createFloat8(val % datum.asFloat8());
case NULL_TYPE:
return datum;
Expand Down
Loading