Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Segmentation fault (core dumped) causing app crash on .query and .querySync #46

Open
martin-kieliszek opened this issue Nov 28, 2018 · 3 comments

Comments

@martin-kieliszek
Copy link

Hi,
I am getting a Segmentation fault (core dumped) after this odbc library executes a heavy (potentially bad performing query) sql string on self.conn.query(sql, cbQuery); command (eg. line 260 of ./lib/odbc.js and line 336 to name a couple). The fault occurs within milliseconds.

Immediate question: How do you recommend I obtain error logs from the cpp binding so that I can provide more information?

Further information:
From what I have experienced so far, this only occurs on particular SQL query strings that are passed into self.conn.query(sql,cbQuery).

Very simple queries - whether they are syntactically incorrect or perfect, have no problem executing towards the target Postgres DB. (Eg. if wrong syntax is passed through the binding, the DB correctly responds back with error messages).

However, a larger query like the one shown below causes a segmentation fault (without the ability for my app to gracefully catch an exception from the cpp binding, inform the user that an error has occured or otherwise fail nicely prior to fault) - it just tears down the entire process within milliseconds.

SQL Query example showing what leads to an seg fault. Hopefully this can help you and I understand what resides within the below string that could cause a segmentation fault in the underlying odbc_binding cpp code

WITH sample_set AS (
  SELECT 
    sample.SERVICE_ID
    , sample.SERVICE_NAME
    , sample.SERVICE_PRICE
    , sample.SERVICE_ORDERED_DATE_TS
    FROM EXAMPLE_SCHEMA_NAME.SERVICE_TABLE sample 
    JOIN (
      SELECT ID
      , COUNT(*) count 
      FROM EXAMPLE_SCHEMA_NAME.SERVICE_TABLE 
      WHERE SERVICE_NAME in (
        SELECT ORDER_SERVICE_NAME
        FROM EXAMPLE_SCHEMA_NAME.SERVICE_ORDER_HISTORY_TIMELINE 
        WHERE ORDER_TYPE='Upgrade' 
        AND ORDERED_DATE > now() - interval '1 day' 
        ORDER BY ORDERED_DATE DESC LIMIT 1
      ) 
      GROUP BY SERVICE_NAME HAVING COUNT(*) > 2
    ) sample on sample.SERVICE_NAME = multiple_service_upgrade_history.SERVICE_NAME
),
numbered_results AS
( SELECT *
  ROW_NUMBER() OVER (PARTITION BY sample_set.SERVICE_NAME ORDER BY sample_set.SERVICE_ORDERED_DATE_TS DESC) AS rownum
  FROM sample_set 
)
SELECT numbered_results.*
FROM numbered_results
WHERE numbered_results.rownum < 3

I won't explain the context of the above query - I have simply presented the precise query structure that causes an Segmentation fault.

I am hoping this issue will help find a new exception to raise within the library such that an error message can be returned to the JS lib

@martin-kieliszek
Copy link
Author

In the interim, I am attempting to take steps forward to understand what is happening.

I am setting up a gdb debugger to listen on the odbc_bindings.node file that resides within the Release/build directory.

eg.

$ gdbserver localhost:4444 ./node_modules/odbc/Release/build/odbc_bindings.node
Process ./odbc_bindings.node created; pid = 22016
Listening on port 4444

With .vscode launch.json settings:

 {
            "name": "C++ Remote Debug",
            "type": "cppdbg",
            "request": "launch",
            "miDebuggerServerAddress": "localhost:4444",
            "program": "${workspaceFolder}/node_modules/odbc/build/Release/odbc_bindings.node",
            "cwd": ".", 
            "linux": {
                "MIMode": "gdb"
            },
            "osx": {
                "MIMode": "lldb"
            },
            "windows": {
                "MIMode": "gdb"
            }
        }

No luck thus far getting any insight

If anyone can provide other debug recommendations, would appreciate your comments.

Happy to follow up this issue with slight direction on environment setup

@martin-kieliszek
Copy link
Author

Seg fault appears to be the result of a missing , within the second AS clause

( SELECT *
  ROW_NUMBER() 

should be

( SELECT *
  , ROW_NUMBER()

Did further testing - Segmentation fault also occurs if a missing , exists between both AS statements.

Other information - also occurs if I run the library and code within another environment such as a docker container with os:

# cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=debian
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

FYI node-odbc version is 1.4.5

Have rebuilt manually within node_modules aswell using make all to ensure everything is all good. Still occuring.

Hope the above information can assist in identifying why there may be a seg fault. Memory issue on SQL validation?

@asztal
Copy link

asztal commented Nov 29, 2018

Have you considered that it might be crashing in the psqlodbc driver itself, or in unixODBC somewhere?

If you enable core dumps you might be able to use gdb to get a stack trace from the core dump, which may at least tell you what the segfaulting module is.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants