Opened 10 years ago
Closed 10 years ago
#812 closed defect (fixed)
Segfault with long case queries
Reported by: | Marcus Sen | Owned by: | Vlad Merticariu |
---|---|---|---|
Priority: | major | Milestone: | 9.1 |
Component: | qlparser | Version: | development |
Keywords: | Cc: | ||
Complexity: | Medium |
Description
If I execute the query:
rasql -q 'select case c when 0 then { 0, 0, 0} when 1 then { 200, 200, 200} when 7 then { 255, 0, 0} when 9 then { 255, 255, 255} when 14 then { 149, 0, 148} when 16 then { 254, 168, 0} when 20 then { 23, 250, 255} when 26 then { 255, 255, 0} when 33 then { 255, 235, 0} when 34 then { 147, 112, 219} when 39 then { 176, 48, 96} when 47 then { 255, 127, 80} when 48 then { 231, 142, 79} when 49 then { 178, 178, 178} when 59 then { 255, 165, 0} when 62 then { 107, 142, 35} else { 0, 0, 255} end from tno_geotop_lithostrat as c' --out file --outfile tno_rgb.mdd --type
I get the error:
rasql: rasdaman query tool v1.0, rasdaman v9.0.3 -- generated on 16.06.2014 09:34:11. opening database RASBASE at localhost:7001...ok Executing retrieval query...rasdaman error 0: Exception: Transfer Failed aborting transaction...ok rasql done.
In rasmgr.nnn.log:
rasdaman server process with pid 12755 has terminated. Error: rasdaman server N1, pid 12755 terminated illegally, reason: exited with return code 255 [2014-07-07 12:34:18] starting server N1, executable /usr/bin/rasserver; pid 12822...
And in N1.012755.log:
Request: 'select case c when 0 then { 0, 0, 0} when 1 then { 200, 200, 200} when 7 then { 255, 0, 0} when 9 then { 255, 255, 255} when 14 then { 149, 0, 148} when 16 then { 254, 168, 0} when 20 then { 23, 250, 255} when 26 then { 255, 255, 0} when 33 then { 255, 235, 0} when 34 then { 147, 112, 219} when 39 then { 176, 48, 96} when 47 then { 255, 127, 80} when 48 then { 231, 142, 79} when 49 then { 178, 178, 178} when 59 then { 255, 165, 0} when 62 then { 107, 142, 35} else { 0, 0, 255} end from tno_geotop_lithostrat as c'...parsing...checking semantics...evaluating...ok, result type 'set <marray <struct { long 0, long 1, long 2 }, [0:199,0:249,0:319]>>', 1 element(s). Segmentation fault caught, stacktrace: [bt]: (1) /lib64/libc.so.6() [0x37182329a0] [bt]: (2) /usr/bin/rasserver() [0x4c586a] [bt]: (3) /usr/bin/rasserver() [0x487f17] [bt]: (4) /usr/bin/rasserver() [0x4ab02e] [bt]: (5) /usr/bin/rasserver() [0x4c1bb8] [bt]: (6) /usr/bin/rasserver() [0x47fc26] [bt]: (7) /usr/bin/rasserver() [0x47fc89] [bt]: (8) /usr/bin/rasserver() [0x4b5e3b] [bt]: (9) /usr/bin/rasserver() [0x44dcd7] [bt]: (10) /usr/bin/rasserver() [0x44043e] [bt]: (11) /usr/bin/rasserver() [0x4591b0] [bt]: (12) /usr/bin/rasserver() [0x459f38] [bt]: (13) /usr/bin/rasserver() [0x45a2aa] [bt]: (14) /usr/bin/rasserver() [0x45dcac] [bt]: (15) /usr/bin/rasserver() [0x5599a8] [bt]: (16) /usr/bin/rasserver() [0x55a422] [bt]: (17) /usr/bin/rasserver() [0x4569ef] [bt]: (18) /usr/bin/rasserver() [0x41d475] [bt]: (19) /lib64/libc.so.6 (??:0) - __libc_start_main+0xfd [0x371821ed1d] [bt]: (20) /usr/bin/rasserver() [0x41bf09] rasserver terminated.
This is pure rasql but you can see a description of the coverage at http://earthserver.bgs.ac.uk/rasdaman/ows?service=WCS&Request=DescribeCoverage&version=2.0.1&CoverageId=tno_geotop_lithostrat&
If I execute what I think is the equivalent using the old-fashioned way of multiplying by boolean expressions rather than using the case statement:
rasql -q 'select (c = 0) * { 0c, 0c, 0c} + (c = 1) * { 200c, 200c, 200c} + (c = 7) * { 255c, 0c, 0c} + (c = 9) * { 255c, 255c, 255c} + (c = 14) * { 149c, 0c, 148c} + (c = 16) * { 254c, 168c, 0c} + (c = 20) * { 23c, 250c, 255c} + (c = 26) * { 255c, 255c, 0c} + (c = 33) * { 255c, 235c, 0c} + (c = 34) * { 147c, 112c, 219c} + (c = 39) * { 176c, 48c, 96c} + (c = 47) * { 255c, 127c, 80c} + (c = 48) * { 231c, 142c, 79c} + (c = 49) * { 178c, 178c, 178c} + (c = 59) * { 255c, 165c, 0c} + (c = 62) * { 107c, 142c, 35c} + (c != 0 and c !=1 and c != 7 and c != 9 and c != 14 and c != 16 and c != 20 and c != 26 and c != 33 and c != 34 and c != 39 and c != 47 and c != 48 and c != 49 and c != 59 and c != 62) * { 0c, 0c, 255c} from tno_geotop_lithostrat as c' --out file --outfile tno_rgb.mdd --type
this seems to work.
Some further investigation with the complexity of statement that fails or not shows that one case and one else as below works:
rasql -q 'select case c when 0 then { 0c, 0c, 0c} else { 0c, 0c, 255c} end from tno_geotop_lithostrat as c' --out file --outfile tno_rgb.mdd --type
but putting one extra when statement as below fails:
rasql -q 'select case c when 0 then { 0c, 0c, 0c} when 1 then { 200c, 200c, 200c} else { 0c, 0c, 255c} end from tno_geotop_lithostrat as c' --out file --outfile tno_rgb.mdd --type
I am using v9.0.3 RPMs
Change History (10)
comment:1 by , 10 years ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
comment:2 by , 10 years ago
follow-up: 4 comment:3 by , 10 years ago
Thanks, that is a useful workaround. When it is patched will there be any difference in performance or how the commands are executed or will it just be a case of syntactic convenience?
comment:4 by , 10 years ago
The difference is purely syntactic. Before execution, the query is transformed in a long case query.
comment:5 by , 10 years ago
I couldn't reproduce any errors on my side, but great that you figured the problem!
comment:8 by , 10 years ago
Component: | undecided → qlparser |
---|---|
Priority: | critical → major |
Ok I'm demoting this to major as there is a workaround for now.
comment:9 by , 10 years ago
Milestone: | → 9.1 |
---|
Hi,
From the initial tests it seems there is a rewriting issue in the short hand case version. I will fix this soon.
A workaround is using the long version, i.e.:
select case when c = 0 then {0c, 0c, 0c} when c = 1 then ….
I'm mentioning this just in case you need to use the query before the patches are applied, if it's not urgent then don't change the query.