Skip to content

Commit 1c32c2c

Browse files
authored
Merge pull request #32 from mindsdb/feature/alter_database
Added the Syntax for ALTER DATABASE
2 parents b214f65 + ebd4440 commit 1c32c2c

File tree

4 files changed

+56
-1
lines changed

4 files changed

+56
-1
lines changed

mindsdb_sql_parser/ast/mindsdb/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from .agents import CreateAgent, DropAgent, UpdateAgent
2+
from .alter_database import AlterDatabase
23
from .create_view import CreateView
34
from .create_database import CreateDatabase
45
from .create_predictor import CreatePredictor, CreateAnomalyDetectionModel
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from mindsdb_sql_parser.ast.base import ASTNode
2+
from mindsdb_sql_parser.ast.select import Identifier
3+
from mindsdb_sql_parser.utils import indent
4+
5+
6+
class AlterDatabase(ASTNode):
7+
"""
8+
Alter a database.
9+
"""
10+
def __init__(self, name: Identifier, altered_params: dict, *args, **kwargs):
11+
"""
12+
Args:
13+
name: Identifier -- name of the database to alter.
14+
altered_params: dict -- parameters to alter in the database.
15+
"""
16+
super().__init__(*args, **kwargs)
17+
self.name = name
18+
self.params = altered_params
19+
20+
def to_tree(self, *args, level=0, **kwargs):
21+
ind = indent(level)
22+
out_str = f'{ind}AlterDatabase(' \
23+
f'name={self.name.to_string()}, ' \
24+
f'altered_params={self.params})'
25+
return out_str
26+
27+
def get_string(self, *args, **kwargs):
28+
params = self.params.copy()
29+
30+
set_ar = [f'{k}={repr(v)}' for k, v in params.items()]
31+
set_str = ', '.join(set_ar)
32+
33+
out_str = f'ALTER DATABASE {self.name.to_string()} {set_str}'
34+
return out_str

mindsdb_sql_parser/parser.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from sly import Parser
22
from mindsdb_sql_parser.ast import *
33
from mindsdb_sql_parser.ast.drop import DropDatabase, DropView
4+
from mindsdb_sql_parser.ast.mindsdb.alter_database import AlterDatabase
45
from mindsdb_sql_parser.ast.mindsdb.agents import CreateAgent, DropAgent, UpdateAgent
56
from mindsdb_sql_parser.ast.mindsdb.drop_datasource import DropDatasource
67
from mindsdb_sql_parser.ast.mindsdb.drop_predictor import DropPredictor
@@ -77,6 +78,7 @@ class MindsDBParser(Parser):
7778
'delete',
7879
'evaluate',
7980
'drop_database',
81+
'alter_database',
8082
'drop_view',
8183
'drop_table',
8284
'create_table',
@@ -350,6 +352,15 @@ def drop_view(self, p):
350352
def drop_database(self, p):
351353
return DropDatabase(name=p.identifier, if_exists=p.if_exists_or_empty)
352354

355+
# ALTER DATABASE
356+
@_('ALTER DATABASE identifier kw_parameter_list')
357+
def alter_database(self, p):
358+
params = {k.lower(): v for k, v in p.kw_parameter_list.items()}
359+
return AlterDatabase(
360+
name=p.identifier,
361+
altered_params=params
362+
)
363+
353364
# Transactions
354365

355366
@_('START TRANSACTION',

tests/test_mindsdb/test_create_integration.py renamed to tests/test_mindsdb/test_databases.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from mindsdb_sql_parser.lexer import MindsDBLexer
77

88

9-
class TestCreateDatabase:
9+
class TestDatabases:
1010
def test_create_database_lexer(self):
1111
sql = "CREATE DATABASE IF NOT EXISTS db WITH ENGINE = 'mysql', PARAMETERS = {\"user\": \"admin\", \"password\": \"admin\"}"
1212
tokens = list(MindsDBLexer().tokenize(sql))
@@ -130,3 +130,12 @@ def test_create_database_using(self):
130130
assert str(ast).lower() == str(expected_ast).lower()
131131
assert ast.to_tree() == expected_ast.to_tree()
132132

133+
134+
def test_alter_database(self):
135+
sql = "ALTER DATABASE db PARAMETERS = {'A': 1, 'B': 2}"
136+
ast = parse_sql(sql)
137+
138+
expected_ast = AlterDatabase(name=Identifier('db'), altered_params={'parameters': {'A': 1, 'B': 2}})
139+
140+
assert str(ast) == str(expected_ast)
141+
assert ast.to_tree() == expected_ast.to_tree()

0 commit comments

Comments
 (0)