#1563 closed defect (fixed)
problem with type assignment while outputting to csv/json from a switch/case query with varying data types in each case
Reported by: | bbell | Owned by: | Dimitar Misev |
---|---|---|---|
Priority: | major | Milestone: | 9.7 |
Component: | qlparser | Version: | development |
Keywords: | Cc: | Dimitar Misev, Vlad Merticariu | |
Complexity: | Medium |
Description (last modified by )
in the wcps query:
for c in (test_mr) return encode(switch case c>0 return log(c) default return (char)0,"csv")
the default case outputs something slightly different from, but arbitrarily close to, 0.
Change History (11)
comment:1 by , 7 years ago
Description: | modified (diff) |
---|
comment:2 by , 7 years ago
Milestone: | → 9.4 |
---|
comment:3 by , 7 years ago
Milestone: | 9.4 → 9.7 |
---|
comment:4 by , 6 years ago
Just to clarify, the resulting rasql query would be:
SELECT encode(CASE WHEN ( c > 0 ) THEN ( log( c ) ) ELSE ( (octet) 0 ) END, "csv" ) FROM test_mr AS c
comment:5 by , 6 years ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
comment:6 by , 6 years ago
This seems to work for me now. We should add a test in test_select to enforce consistency of this behavior for future patches, and close this ticket.
comment:7 by , 6 years ago
There's a memory error currently, because the scalar value is in a buffer of size 1, but the result is floats (so size 4), case tries to copy 4 bytes from the scalar value.. so it randomly results in a random output.
The correct way to fix this issue is to throw an exception that the types in the THEN/ELSE clauses do not match in checkType. They should all be of the same base type.
Request: 'select encode((case when(c > 0) then (log(c)) else (0f) end)[75:85,75:85], "csv") from test_grey as c'... parsing... checking semantics... evaluating... cell count: 0 ================================================================= ==19981==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000007d74 at pc 0x7f67b4fad6c2 bp 0x7ffe68d938a0 sp 0x7ffe68d93050 READ of size 8 at 0x602000007d74 thread T0 #0 0x7f67b4fad6c1 (/usr/lib/x86_64-linux-gnu/libasan.so.4+0x766c1) #1 0x5647d09030c7 in Tile::setCell(unsigned long, char const*) tilemgr/tile.cc:1018 #2 0x5647d0a7a417 in QtCaseOp::evaluateInducedOp(std::vector<QtData*, std::allocator<QtData*> >*) qlparser/qtcaseop.cc:347 #3 0x5647d0a7ae59 in QtCaseOp::evaluate(std::vector<QtData*, std::allocator<QtData*> >*) qlparser/qtcaseop.cc:464 #4 0x5647d0ae1618 in QtDomainOperation::evaluate(std::vector<QtData*, std::allocator<QtData*> >*) qlparser/qtdomainoperation.cc:508 #5 0x5647d0ace4db in QtConversion::evaluate(std::vector<QtData*, std::allocator<QtData*> >*) qlparser/qtconversion.cc:192 #6 0x5647d0b459ff in QtOperationIterator::next() qlparser/qtoperationiterator.cc:253 #7 0x5647d0ba4bb8 in QueryTree::evaluateRetrieval() qlparser/querytree.cc:174 #8 0x5647d09572b1 in ServerComm::executeQuery(unsigned long, char const*, ExecuteQueryRes&) servercomm/servercomm2.cc:1662 #9 0x5647d05ad707 in doStuff() applications/directql/directql.cc:1125 #10 0x5647d05ae427 in main applications/directql/directql.cc:1194 #11 0x7f67b15a4a86 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21a86) #12 0x5647d05a6209 in _start (/home/dimitar/rasdaman/community/src-install/bin/directql+0xa2b209) 0x602000007d74 is located 0 bytes to the right of 4-byte region [0x602000007d70,0x602000007d74) allocated by thread T0 here: #0 0x7f67b50124e0 in operator new[](unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdb4e0) #1 0x5647d0a51f57 in QtAtomicData::QtAtomicData(double, unsigned short) qlparser/qtatomicdata.cc:148 #2 0x5647d0a107ef in yyparse(void*) build/qlparser/oql.yy:3832 #3 0x5647d09570cd in ServerComm::executeQuery(unsigned long, char const*, ExecuteQueryRes&) servercomm/servercomm2.cc:1639 #4 0x5647d05ad707 in doStuff() applications/directql/directql.cc:1125 #5 0x5647d05ae427 in main applications/directql/directql.cc:1194 #6 0x7f67b15a4a86 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21a86)
comment:8 by , 6 years ago
Cc: | added |
---|
comment:9 by , 6 years ago
Owner: | changed from | to
---|
comment:10 by , 6 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
comment:11 by , 6 years ago
You get a nice error now that such a query is not allowed. You need to cast the 0 to double in this case to match the type of log().
Please try to set the milestone in new tickets.