From 5c2fa7aed6d76d7a7ef23b974ce5d29c638234eb Mon Sep 17 00:00:00 2001 From: yanhuqing Date: Tue, 26 Sep 2017 16:35:48 +0800 Subject: [PATCH] eavl SQLBinaryExpr --- .../druid/sql/ast/expr/SQLBinaryExpr.java | 2 +- .../sql/visitor/SQLEvalVisitorUtils.java | 6 +++--- .../bvt/sql/eval/SQLEvalVisitorUtilsTest.java | 21 +++++++++++++------ 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryExpr.java index 12cbd0b664..8aa6fecab0 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryExpr.java @@ -18,7 +18,7 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLExprImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class SQLBinaryExpr extends SQLExprImpl implements SQLLiteralExpr, SQLValuableExpr { +public class SQLBinaryExpr extends SQLExprImpl implements SQLLiteralExpr { private String value; diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java index 167379d49e..d633f0701e 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java @@ -584,11 +584,11 @@ public class SQLEvalVisitorUtils { String text = x.getValue(); long[] words = new long[text.length() / 64 + 1]; - for (int i = 0; i < text.length(); ++i) { + for (int i = text.length()-1; i >= 0 ; --i) { char ch = text.charAt(i); if (ch == '1') { int wordIndex = i >> 6; - words[wordIndex] |= (1L << i); + words[wordIndex] |= (1L << (text.length() - 1 - i)); } } @@ -600,7 +600,7 @@ public class SQLEvalVisitorUtils { byte[] bytes = new byte[words.length * 8]; for (int i = 0; i < words.length; ++i) { - Utils.putLong(bytes, i * 8, words[i]); + Utils.putLong(bytes, (words.length-1-i) * 8, words[i]); } val = new BigInteger(bytes); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/SQLEvalVisitorUtilsTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/SQLEvalVisitorUtilsTest.java index 66fe661d09..696543324e 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/eval/SQLEvalVisitorUtilsTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/SQLEvalVisitorUtilsTest.java @@ -1,15 +1,16 @@ package com.alibaba.druid.bvt.sql.eval; +import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcUtils; +import junit.framework.TestCase; +import org.junit.Assert; + import java.math.BigDecimal; import java.math.BigInteger; +import java.util.ArrayList; import java.util.Arrays; -import org.junit.Assert; -import junit.framework.TestCase; - -import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; -import com.alibaba.druid.util.JdbcUtils; - public class SQLEvalVisitorUtilsTest extends TestCase { public void test_instance() throws Exception { @@ -168,4 +169,12 @@ public class SQLEvalVisitorUtilsTest extends TestCase { Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcUtils.MYSQL, "? >= ?", Arrays. asList(3, 3))); Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcUtils.MYSQL, "? >= ?", Arrays. asList(4, 3))); } + + public void test_binary() throws Exception { + Assert.assertEquals(1L, SQLEvalVisitorUtils.eval(JdbcUtils.MYSQL, new SQLBinaryExpr("01"), new ArrayList())); + Assert.assertEquals(2L, SQLEvalVisitorUtils.eval(JdbcUtils.MYSQL, new SQLBinaryExpr("10"), new ArrayList())); + Assert.assertEquals(3L, SQLEvalVisitorUtils.eval(JdbcUtils.MYSQL, new SQLBinaryExpr("11"), new ArrayList())); + Assert.assertEquals(4L, SQLEvalVisitorUtils.eval(JdbcUtils.MYSQL, new SQLBinaryExpr("100"), new ArrayList())); + Assert.assertEquals(new BigInteger("36893488147419103231"), SQLEvalVisitorUtils.eval(JdbcUtils.MYSQL, new SQLBinaryExpr("11111111111111111111111111111111111111111111111111111111111111111"), new ArrayList())); + } }