diff --git a/evadb/binder/statement_binder.py b/evadb/binder/statement_binder.py index 199c53518..f9087b5be 100644 --- a/evadb/binder/statement_binder.py +++ b/evadb/binder/statement_binder.py @@ -32,6 +32,7 @@ from evadb.binder.statement_binder_context import StatementBinderContext from evadb.catalog.catalog_type import ColumnType, TableType from evadb.catalog.catalog_utils import get_metadata_properties, is_document_table +from evadb.catalog.sql_config import RESTRICTED_COL_NAMES from evadb.configuration.constants import EvaDB_INSTALLATION_DIR from evadb.expression.abstract_expression import AbstractExpression, ExpressionType from evadb.expression.function_expression import FunctionExpression @@ -201,6 +202,12 @@ def _bind_delete_statement(self, node: DeleteTableStatement): @bind.register(CreateTableStatement) def _bind_create_statement(self, node: CreateTableStatement): + # we don't allow certain keywords in the column_names + for col in node.column_list: + assert ( + col.name.lower() not in RESTRICTED_COL_NAMES + ), f"EvaDB does not allow to create a table with column name {col.name}" + if node.query is not None: self.bind(node.query) diff --git a/evadb/catalog/sql_config.py b/evadb/catalog/sql_config.py index f4893ba99..778d2cb24 100644 --- a/evadb/catalog/sql_config.py +++ b/evadb/catalog/sql_config.py @@ -41,6 +41,9 @@ "function_cost_catalog", "function_metadata_catalog", ] +# Add all keywords that are restricted by EvaDB + +RESTRICTED_COL_NAMES = [IDENTIFIER_COLUMN] class SingletonMeta(type): diff --git a/test/integration_tests/long/test_create_table_executor.py b/test/integration_tests/long/test_create_table_executor.py index b4e4856b5..7f1bf38de 100644 --- a/test/integration_tests/long/test_create_table_executor.py +++ b/test/integration_tests/long/test_create_table_executor.py @@ -122,6 +122,15 @@ def test_create_table_with_incorrect_info(self): execute_query_fetch_all(self.evadb, create_table) execute_query_fetch_all(self.evadb, "DROP TABLE SlackCSV;") + def test_create_table_with_restricted_keywords(self): + create_table = "CREATE TABLE hello (_row_id INTEGER, price TEXT);" + with self.assertRaises(AssertionError): + execute_query_fetch_all(self.evadb, create_table) + + create_table = "CREATE TABLE hello2 (_ROW_id INTEGER, price TEXT);" + with self.assertRaises(AssertionError): + execute_query_fetch_all(self.evadb, create_table) + if __name__ == "__main__": unittest.main()