|
| 1 | +package sqlancer.pqs.sqlite.cast; |
| 2 | + |
| 3 | +import static org.junit.jupiter.api.Assertions.assertEquals; |
| 4 | + |
| 5 | +import java.util.ArrayList; |
| 6 | +import java.util.List; |
| 7 | + |
| 8 | +import org.junit.jupiter.api.Test; |
| 9 | + |
| 10 | +import sqlancer.sqlite3.SQLite3Visitor; |
| 11 | +import sqlancer.sqlite3.ast.SQLite3Cast; |
| 12 | +import sqlancer.sqlite3.ast.SQLite3Constant; |
| 13 | +import sqlancer.sqlite3.schema.SQLite3DataType; |
| 14 | + |
| 15 | +class TestCastToNumeric { |
| 16 | + |
| 17 | + @Test |
| 18 | + void testLong() { |
| 19 | + long numbers[] = new long[] { 0, 1, 123, Long.MAX_VALUE, Long.MIN_VALUE }; |
| 20 | + for (long number : numbers) { |
| 21 | + assertEquals(castLongConstant(number), number); |
| 22 | + } |
| 23 | + } |
| 24 | + |
| 25 | + class StringTestTriple { |
| 26 | + String value; |
| 27 | + SQLite3DataType type; |
| 28 | + Object expectedCastValue; |
| 29 | + |
| 30 | + public StringTestTriple(String value, SQLite3DataType type, Object expectedCastValue) { |
| 31 | + this.value = value; |
| 32 | + this.type = type; |
| 33 | + this.expectedCastValue = expectedCastValue; |
| 34 | + } |
| 35 | + } |
| 36 | + |
| 37 | + @Test |
| 38 | + void testString() { |
| 39 | + List<StringTestTriple> triples = new ArrayList<>(); |
| 40 | + triples.add(new StringTestTriple("-3.0", SQLite3DataType.INT, -3L)); |
| 41 | + triples.add(new StringTestTriple("8.2250617031974513E18", SQLite3DataType.REAL, 8.2250617031974513E18)); |
| 42 | + |
| 43 | + triples.add(new StringTestTriple("-2277224522334683278", SQLite3DataType.INT, -2277224522334683278L)); |
| 44 | + |
| 45 | + triples.add(new StringTestTriple("123a", SQLite3DataType.INT, 123L)); |
| 46 | + triples.add(new StringTestTriple("", SQLite3DataType.INT, 0L)); |
| 47 | + triples.add(new StringTestTriple("a", SQLite3DataType.INT, 0L)); |
| 48 | + triples.add(new StringTestTriple("3", SQLite3DataType.INT, 3L)); |
| 49 | + triples.add(new StringTestTriple("-3", SQLite3DataType.INT, -3L)); |
| 50 | + triples.add(new StringTestTriple("0.0", SQLite3DataType.INT, 0L)); |
| 51 | + triples.add(new StringTestTriple("+0", SQLite3DataType.INT, 0L)); |
| 52 | + triples.add(new StringTestTriple("+9", SQLite3DataType.INT, 9L)); |
| 53 | + triples.add(new StringTestTriple("++9", SQLite3DataType.INT, 0L)); |
| 54 | + triples.add(new StringTestTriple("+-9", SQLite3DataType.INT, 0L)); |
| 55 | + triples.add(new StringTestTriple("-1748799336", SQLite3DataType.INT, -1748799336L)); |
| 56 | + triples.add(new StringTestTriple("-0", SQLite3DataType.INT, 0L)); |
| 57 | + |
| 58 | + triples.add(new StringTestTriple("4E ", SQLite3DataType.INT, 4L)); |
| 59 | + triples.add(new StringTestTriple("3.0e+5", SQLite3DataType.INT, 300000L)); |
| 60 | + triples.add(new StringTestTriple("-3.2", SQLite3DataType.REAL, -3.2d)); |
| 61 | + triples.add(new StringTestTriple("10e9", SQLite3DataType.INT, 10000000000L)); |
| 62 | + // triples.add(new StringTestTriple("-0.0", SQLite3DataType.REAL, 0.0d)); |
| 63 | + triples.add(new StringTestTriple("9223372036854775807", SQLite3DataType.INT, 9223372036854775807L)); |
| 64 | + triples.add(new StringTestTriple("4337561223119921152", SQLite3DataType.INT, 4337561223119921152L)); |
| 65 | + triples.add(new StringTestTriple("7839344951195291815", SQLite3DataType.INT, 7839344951195291815L)); |
| 66 | + |
| 67 | + // infinities |
| 68 | + triples.add(new StringTestTriple("-Infinity", SQLite3DataType.INT, 0L)); // |
| 69 | + triples.add(new StringTestTriple("Infinity", SQLite3DataType.INT, 0L)); // |
| 70 | + triples.add(new StringTestTriple("Inf", SQLite3DataType.INT, 0L)); // |
| 71 | + triples.add(new StringTestTriple("-Inf", SQLite3DataType.INT, 0L)); // |
| 72 | + triples.add(new StringTestTriple("NaN", SQLite3DataType.INT, 0L)); // |
| 73 | + triples.add(new StringTestTriple("1e500", SQLite3DataType.REAL, Double.POSITIVE_INFINITY)); // |
| 74 | + triples.add(new StringTestTriple("-1e500", SQLite3DataType.REAL, Double.NEGATIVE_INFINITY)); // |
| 75 | + |
| 76 | + for (StringTestTriple triple : triples) { |
| 77 | + SQLite3Constant castVal = SQLite3Cast.castToNumeric(SQLite3Constant.createTextConstant(triple.value)); |
| 78 | + assertEquals(triple.expectedCastValue, castVal.getValue(), triple.value.toString()); |
| 79 | + } |
| 80 | + } |
| 81 | + |
| 82 | + @Test |
| 83 | + void testBinary() { |
| 84 | + List<StringTestTriple> triples = new ArrayList<>(); |
| 85 | + triples.add(new StringTestTriple("112B3980", SQLite3DataType.INT, 0L)); // +9� |
| 86 | + triples.add(new StringTestTriple("0936", SQLite3DataType.INT, 6L)); // 6 |
| 87 | + triples.add(new StringTestTriple("0C36", SQLite3DataType.INT, 6L)); // 6 |
| 88 | + triples.add(new StringTestTriple("0a36", SQLite3DataType.INT, 6L)); // 6 |
| 89 | + triples.add(new StringTestTriple("0b36", SQLite3DataType.INT, 6L)); // 6 |
| 90 | + triples.add(new StringTestTriple("0c36", SQLite3DataType.INT, 6L)); // 6 |
| 91 | + triples.add(new StringTestTriple("0d36", SQLite3DataType.INT, 6L)); // 6 |
| 92 | + triples.add(new StringTestTriple("0e36", SQLite3DataType.INT, 0L)); // 6 |
| 93 | + triples.add(new StringTestTriple("1a347C", SQLite3DataType.INT, 0L)); // |
| 94 | + triples.add(new StringTestTriple("1b347C", SQLite3DataType.INT, 0L)); // |
| 95 | + triples.add(new StringTestTriple("1C32", SQLite3DataType.INT, 0L)); // FS2 |
| 96 | + triples.add(new StringTestTriple("1D32", SQLite3DataType.INT, 0L)); // GS2 |
| 97 | + triples.add(new StringTestTriple("1e32", SQLite3DataType.INT, 0L)); // RS2 |
| 98 | + triples.add(new StringTestTriple("1f32", SQLite3DataType.INT, 0L)); // RS2 |
| 99 | + triples.add(new StringTestTriple("2032", SQLite3DataType.INT, 2L)); // RS2 |
| 100 | + triples.add(new StringTestTriple("09013454", SQLite3DataType.INT, 0L)); // RS2 |
| 101 | + triples.add(new StringTestTriple("2016347C", SQLite3DataType.INT, 0L)); // |
| 102 | + triples.add(new StringTestTriple("2017347C", SQLite3DataType.INT, 0L)); // |
| 103 | + triples.add(new StringTestTriple("2018347C", SQLite3DataType.INT, 0L)); // |
| 104 | + triples.add(new StringTestTriple("2019347C", SQLite3DataType.INT, 0L)); // |
| 105 | + |
| 106 | + for (StringTestTriple triple : triples) { |
| 107 | + SQLite3Constant castVal = SQLite3Cast.castToNumeric( |
| 108 | + SQLite3Constant.createBinaryConstant(SQLite3Visitor.hexStringToByteArray(triple.value))); |
| 109 | + assertEquals(triple.expectedCastValue, castVal.getValue(), triple.value.toString()); |
| 110 | + } |
| 111 | + } |
| 112 | + |
| 113 | + private long castLongConstant(long constant) { |
| 114 | + return SQLite3Cast.castToNumeric(SQLite3Constant.createIntConstant(constant)).asInt(); |
| 115 | + } |
| 116 | + |
| 117 | +} |
0 commit comments