提交 66e637c9 编写于 作者: V Vlad Ilyushchenko

null in where clause can be used instead of NaN

上级 d918ac16
......@@ -137,10 +137,35 @@ public final class FunctionFactories {
break;
case STRING:
if (vc.getFlyweightStr(null) == null) {
ColumnType t = sig.paramTypes.getQuick(0);
if (Chars.equals(sig.name, '=')) {
return StrEqualsNullOperator.FACTORY;
switch (t) {
case DOUBLE:
return DoubleEqualsNanOperator.FACTORY;
case STRING:
return StrEqualsNullOperator.FACTORY;
case INT:
return IntEqualsNaNOperator.FACTORY;
case LONG:
case DATE:
return LongEqualsNaNOperator.FACTORY;
default:
break;
}
} else if (Chars.equals(sig.name, "!=")) {
return StrNotEqualsNullOperator.FACTORY;
switch (t) {
case DOUBLE:
return DoubleNotEqualsNanOperator.FACTORY;
case STRING:
return StrNotEqualsNullOperator.FACTORY;
case INT:
return IntNotEqualsNaNOperator.FACTORY;
case LONG:
case DATE:
return LongNotEqualsNaNOperator.FACTORY;
default:
break;
}
}
}
break;
......
/*******************************************************************************
* ___ _ ____ ____
* / _ \ _ _ ___ ___| |_| _ \| __ )
* | | | | | | |/ _ \/ __| __| | | | _ \
* | |_| | |_| | __/\__ \ |_| |_| | |_) |
* \__\_\\__,_|\___||___/\__|____/|____/
*
* ___ _ ____ ____
* / _ \ _ _ ___ ___| |_| _ \| __ )
* | | | | | | |/ _ \/ __| __| | | | _ \
* | |_| | |_| | __/\__ \ |_| |_| | |_) |
* \__\_\\__,_|\___||___/\__|____/|____/
* <p>
* Copyright (C) 2014-2016 Appsicle
*
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* <p>
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* <p>
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* <p>
* As a special exception, the copyright holders give permission to link the
* code of portions of this program with the OpenSSL library under certain
* conditions as described in each individual source file and distribute
......@@ -30,7 +30,6 @@
* delete this exception statement from your version. If you delete this
* exception statement from all source files in the program, then also delete
* it in the license file.
*
******************************************************************************/
package com.nfsdb.ql.parser;
......@@ -64,18 +63,10 @@ class VirtualColumnBuilder implements PostOrderTreeTraversalAlgo.Visitor {
private CharSequenceIntHashMap columnNameHistogram;
private CharSequenceObjHashMap<Parameter> parameterMap;
public VirtualColumnBuilder(PostOrderTreeTraversalAlgo algo) {
VirtualColumnBuilder(PostOrderTreeTraversalAlgo algo) {
this.algo = algo;
}
public VirtualColumn createVirtualColumn(QueryModel model, ExprNode node, RecordMetadata metadata) throws ParserException {
this.columnNameHistogram = model.getColumnNameHistogram();
this.parameterMap = model.getParameterMap();
this.metadata = metadata;
algo.traverse(node, this);
return stack.poll();
}
@Override
public void visit(ExprNode node) throws ParserException {
int argCount = node.paramCount;
......@@ -115,6 +106,14 @@ class VirtualColumnBuilder implements PostOrderTreeTraversalAlgo.Visitor {
}
}
VirtualColumn createVirtualColumn(QueryModel model, ExprNode node, RecordMetadata metadata) throws ParserException {
this.columnNameHistogram = model.getColumnNameHistogram();
this.parameterMap = model.getParameterMap();
this.metadata = metadata;
algo.traverse(node, this);
return stack.poll();
}
@SuppressFBWarnings({"LEST_LOST_EXCEPTION_STACK_TRACE"})
private VirtualColumn lookupColumn(ExprNode node) throws ParserException {
try {
......
......@@ -843,6 +843,19 @@ public class JoinQueryTest extends AbstractOptimiserTest {
" limit 10,15");
}
@Test
public void testNullInsteadOfNaN() throws Exception {
assertThat("1406\tVQHYIIQL\tKJE\tnull\tDYQFLMPNGEJKKJCRCKNPUTHTVNYXM\tDFDISBFBRCCQDV\tXTGNJ\t2015-07-10T00:00:01.406Z\tNaN\tNaN\tNaN\t\t\tnull\n" +
"1414\tDHMTF\tRTGV\tnull\tHMDJSBGPXQTKPGGWFSTJSKSZSBEPDVNMFEVEMQCOHDBK\tJKBVDSERXZ\tOEENNEBQQEMXD\t2015-07-10T00:00:01.414Z\tNaN\tNaN\tNaN\t\t\tnull\n" +
"1422\tEKVFCZGGCKCHK\tEEGCRISJP\tnull\tILWBREVXDHHWPREIFCMLRXSWMFWEKIOTXUPRNGEPIJVNKTXHNKYITYG\tYYBJER\tCNSFFLTRY\t2015-07-10T00:00:01.422Z\tNaN\tNaN\tNaN\t\t\tnull\n" +
"1523\tV\tODSBTX\tnull\tECUZSRJCTRJLH\tVBNHX\tZHEI\t2015-07-10T00:00:01.523Z\tNaN\tNaN\tNaN\t\t\tnull\n" +
"1567\tBWPEIFNITZK\tBIJXCYTOHOQT\tnull\tYZMMSEZIPCOCZZUFYIVELTS\tFVPDDGSEK\tUN\t2015-07-10T00:00:01.567Z\tNaN\tNaN\tNaN\t\t\tnull\n",
"customers c" +
" outer join orders o on c.customerId = o.customerId " +
" where orderId = null" +
" limit 10,15");
}
@Test
public void testNullSymbol() throws Exception {
assertThat("",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册