Skip to content

ORACLE DEFAULT 0 ON CONVERSTION ERROR causes exception #7685

@graymcd

Description

@graymcd

Using DEFAULT ON CONVERSTION ERROR in to_number function causes parsing error.

Dialect: oracle

Example query:

SELECT
    TO_NUMBER('dino' DEFAULT 0 ON CONVERSION ERROR) AS Result
FROM 
    dual;

Error:
Expecting ). Line 2, Col: 28.

Repro code:

import sqlglot

query = """SELECT
    TO_NUMBER('dino' DEFAULT 0 ON CONVERSION ERROR) AS Result
FROM 
    dual;"""

try:
    ast = sqlglot.parse_one(query,read="oracle")
except sqlglot.ParseError as p:
    print('Parsing error!')
    print(p)
except Exception as e:
    print(type(e))
    print(e)

Full traceback:

Traceback (most recent call last):
  File "C:\local\git\junk\PySqlGlotTests\defaulterror.py", line 9, in <module>
    ast = sqlglot.parse_one(query,read="oracle")
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\__init__.py", line 160, in parse_one
    result = dialect.parse(sql, **opts)
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\dialects\dialect.py", line 1119, in parse
    return self.parser(**opts).parse(self.tokenize(sql), sql)
           ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 2035, in parse
    return self._parse(
           ~~~~~~~~~~~^
        parse_method=self.__class__._parse_statement, raw_tokens=raw_tokens, sql=sql
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 2155, in _parse
    return self._parse_batch_statements(parse_method=parse_method, sep_first_statement=False)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 2122, in _parse_batch_statements
    expressions.append(parse_method(self))
                       ~~~~~~~~~~~~^^^^^^
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 2285, in _parse_statement
    expression = self._parse_set_operations(expression) if expression else self._parse_select()
                                                                           ~~~~~~~~~~~~~~~~~~^^
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 3778, in _parse_select
    query = self._parse_select_query(
        nested=nested,
    ...<2 lines>...
        parse_set_operation=parse_set_operation,
    )
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 3879, in _parse_select_query
    projections, exclude = self._parse_projections()
                           ~~~~~~~~~~~~~~~~~~~~~~~^^
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 3734, in _parse_projections
    return self._parse_expressions(), None
           ~~~~~~~~~~~~~~~~~~~~~~~^^
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 8508, in _parse_expressions
    return self._parse_csv(self._parse_expression)
           ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 8473, in _parse_csv
    parse_result = parse_method()
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 5702, in _parse_expression
    return self._parse_alias(self._parse_assignment())
                             ~~~~~~~~~~~~~~~~~~~~~~^^
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 5705, in _parse_assignment
    this = self._parse_disjunction()
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 5727, in _parse_disjunction
    this = self._parse_conjunction()
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 5739, in _parse_conjunction
    this = self._parse_equality()
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 5751, in _parse_equality
    this = self._parse_comparison()
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 5763, in _parse_comparison
    this = self._parse_range()
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 5773, in _parse_range
    this = this or self._parse_bitwise()
                   ~~~~~~~~~~~~~~~~~~~^^
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 5979, in _parse_bitwise
    this = self._parse_term()
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 6012, in _parse_term
    this = self._parse_factor()
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 6035, in _parse_factor
    this = self._parse_at_time_zone(parse_method())
                                    ~~~~~~~~~~~~^^
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 6067, in _parse_unary
    return self._parse_type()
           ~~~~~~~~~~~~~~~~^^
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 6072, in _parse_type
    if not fallback_to_identifier and (atom := self._parse_atom()) is not None:
                                               ~~~~~~~~~~~~~~~~^^
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 6477, in _parse_atom
    and (column := self._parse_column()) is not None
                   ~~~~~~~~~~~~~~~~~~^^
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 6502, in _parse_column
    this = self._parse_column_reference()
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 6589, in _parse_column_reference
    this = self._parse_field()
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 6818, in _parse_field
    field = self._parse_primary() or self._parse_function(
                                     ~~~~~~~~~~~~~~~~~~~~^
        anonymous=anonymous_func, any_token=any_token
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 6841, in _parse_function
    func = self._parse_function_call(
        functions=functions,
    ...<2 lines>...
        any_token=any_token,
    )
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 6970, in _parse_function_call
    self._match_r_paren(result)
    ~~~~~~~~~~~~~~~~~~~^^^^^^^^
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 9297, in _match_r_paren
    self.raise_error("Expecting )")
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
  File "C:\local\git\junk\webappsvcstest\.venv\Lib\site-packages\sqlglot\parser.py", line 1992, in raise_error
    raise error
sqlglot.errors.ParseError: Expecting ). Line 2, Col: 28.
  SELECT
    TO_NUMBER('dino' DEFAULT 0 ON CONVERSION ERROR) AS Result
FROM 
    dual;

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions