mindsdb icon indicating copy to clipboard operation
mindsdb copied to clipboard

[Bug]: get exception 'Star' object has no attribute 'upper'

Open dimonb opened this issue 1 year ago • 2 comments

Short description of current behavior

When doing query:

SELECT x.* FROM mindsdb.models x;

got exception

mindsdb_1                     | During handling of the above exception, another exception occurred:
mindsdb_1                     | 
mindsdb_1                     | Traceback (most recent call last):
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb/api/mysql/mysql_proxy/mysql_proxy.py", line 722, in handle
mindsdb_1                     |     response = self.process_query(sql)
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb/utilities/profiler/profiler.py", line 141, in wrapper
mindsdb_1                     |     result = function(*args, **kwargs)
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb/api/mysql/mysql_proxy/mysql_proxy.py", line 527, in process_query
mindsdb_1                     |     executor.query_execute(sql)
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb/utilities/profiler/profiler.py", line 141, in wrapper
mindsdb_1                     |     result = function(*args, **kwargs)
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb/api/mysql/mysql_proxy/executor/mysql_executor.py", line 115, in query_execute
mindsdb_1                     |     self.do_execute()
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb/utilities/profiler/profiler.py", line 141, in wrapper
mindsdb_1                     |     result = function(*args, **kwargs)
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb/api/mysql/mysql_proxy/executor/mysql_executor.py", line 168, in do_execute
mindsdb_1                     |     ret = self.command_executor.execute_command(self.query)
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb/utilities/profiler/profiler.py", line 141, in wrapper
mindsdb_1                     |     result = function(*args, **kwargs)
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb/api/executor/command_executor.py", line 608, in execute_command
mindsdb_1                     |     query = SQLQuery(statement, session=self.session, database=database_name)
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb/api/executor/sql_query/sql_query.py", line 92, in __init__
mindsdb_1                     |     self.execute_query()
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb/api/executor/sql_query/sql_query.py", line 265, in execute_query
mindsdb_1                     |     raise e
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb/api/executor/sql_query/sql_query.py", line 259, in execute_query
mindsdb_1                     |     data = self.execute_step(step)
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb/api/executor/sql_query/sql_query.py", line 319, in execute_step
mindsdb_1                     |     return handler(self).call(step)
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb/api/executor/sql_query/steps/fetch_dataframe.py", line 99, in call
mindsdb_1                     |     data, columns_info = dn.query(
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb/api/executor/datahub/datanodes/project_datanode.py", line 106, in query
mindsdb_1                     |     data, columns_info = self.information_schema.query(new_query)
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb/api/executor/datahub/datanodes/information_schema_datanode.py", line 166, in query
mindsdb_1                     |     data = query_df(dataframe, query, session=self.session)
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb/api/executor/utilities/sql.py", line 161, in query_df
mindsdb_1                     |     query_str = render.get_string(query_ast, with_failback=True)
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb_sql/render/sqlalchemy_render.py", line 671, in get_string
mindsdb_1                     |     stmt = self.get_query(ast_query)
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb_sql/render/sqlalchemy_render.py", line 649, in get_query
mindsdb_1                     |     stmt = self.prepare_select(ast_query)
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb_sql/render/sqlalchemy_render.py", line 379, in prepare_select
mindsdb_1                     |     col = self.to_expression(t)
mindsdb_1                     |   File "/usr/local/lib/python3.10/site-packages/mindsdb_sql/render/sqlalchemy_render.py", line 121, in to_expression
mindsdb_1                     |     name = t.parts[0].upper()
mindsdb_1                     | AttributeError: 'Star' object has no attribute 'upper'
mindsdb_1                     | 
mindsdb_1                     | 'Star' object has no attribute 'upper'

SELECT * FROM mindsdb.models x; is ok

Video or screenshots

No response

Expected behavior

No response

How to reproduce the error

do SELECT x.* FROM mindsdb.models x;

Anything else?

No response

dimonb avatar Jun 06 '24 11:06 dimonb

This error is reproducible as per the instructions provided.

While debugging the issue the error generates from the mindsdb_sql package sqlalchemy_render.py. The following queries were ran to get the query_ast and type(query_ast) in the file mindsdb/api/executor/utilities/sql.py line 171 and checking the value for t in file mindsdb_sql/render/sqlalchemy_render.py line: 375

The results are:

Input (Error):

select x.* from mindsdb.models as x

query_ast ------> SELECT * FROM df AS x WHERE `project` = 'mindsdb'

type(query_ast): ------> <class 'mindsdb_sql.parser.ast.select.select.Select'>

t: ------> Identifier:<*>

Input (No Error):

select * from mindsdb.models as x

query_ast ------> SELECT * FROM df AS x WHERE `project` = 'mindsdb'

type(query_ast): ------> <class 'mindsdb_sql.parser.ast.select.select.Select'>

t: ------> Star:<*>

I have added a simple check for the input to verify if it is of type string in sqlalchemy_render.py

#### Line 117 - 123
elif isinstance(t, ast.Identifier):
            # sql functions
            col = None
            if len(t.parts) == 1 and isinstance(t, str):
                name = t.parts[0].upper()
                if name == 'CURRENT_DATE':
                    col = sa_fnc.current_date()

which resolves the issue. But a moderator can guide if this is an issue with the library mindsdb_sql and the issue should be moved there or further investigation is required to make the behavior consistent for passing the Star objects with/without alias

srehman420 avatar Jun 18 '24 19:06 srehman420

@ZoranPandovski do we need to support this syntax ?

parthiv11 avatar Mar 30 '25 06:03 parthiv11