Skip to content

Commit 02f0520

Browse files
fix: resolve circular import issues in SQLAlchemy modules
Create dedicated constants module to break circular import dependencies: - Extract DDL_RESERVED_WORDS and SELECT_STATEMENT_RESERVED_WORDS to constants.py - Update preparer.py to import from constants module instead of base.py - Remove unused imports from base.py to clean up dependencies - Maintain all existing functionality while improving module structure This resolves circular import chain: base.py -> preparer.py -> base.py -> compiler.py -> preparer.py All linting and type checks pass: ✅ ruff check ✅ ruff format ✅ mypy 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 536128f commit 02f0520

3 files changed

Lines changed: 262 additions & 283 deletions

File tree

pyathena/sqlalchemy/base.py

Lines changed: 0 additions & 282 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
MutableMapping,
1313
Optional,
1414
Pattern,
15-
Set,
1615
Tuple,
1716
Type,
1817
Union,
@@ -57,287 +56,6 @@
5756
)
5857
from sqlalchemy.sql.schema import SchemaItem
5958

60-
# https://docs.aws.amazon.com/athena/latest/ug/reserved-words.html#list-of-ddl-reserved-words
61-
DDL_RESERVED_WORDS: Set[str] = {
62-
"ALL",
63-
"ALTER",
64-
"AND",
65-
"ARRAY",
66-
"AS",
67-
"AUTHORIZATION",
68-
"BETWEEN",
69-
"BIGINT",
70-
"BINARY",
71-
"BOOLEAN",
72-
"BOTH",
73-
"BY",
74-
"CASE",
75-
"CASHE",
76-
"CAST",
77-
"CHAR",
78-
"COLUMN",
79-
"COMMIT",
80-
"CONF",
81-
"CONSTRAINT",
82-
"CREATE",
83-
"CROSS",
84-
"CUBE",
85-
"CURRENT",
86-
"CURRENT_DATE",
87-
"CURRENT_TIMESTAMP",
88-
"CURSOR",
89-
"DATABASE",
90-
"DATE",
91-
"DAYOFWEEK",
92-
"DECIMAL",
93-
"DELETE",
94-
"DESCRIBE",
95-
"DISTINCT",
96-
"DOUBLE",
97-
"DROP",
98-
"ELSE",
99-
"END",
100-
"EXCHANGE",
101-
"EXISTS",
102-
"EXTENDED",
103-
"EXTERNAL",
104-
"EXTRACT",
105-
"FALSE",
106-
"FETCH",
107-
"FLOAT",
108-
"FLOOR",
109-
"FOLLOWING",
110-
"FOR",
111-
"FOREIGN",
112-
"FROM",
113-
"FULL",
114-
"FUNCTION",
115-
"GRANT",
116-
"GROUP",
117-
"GROUPING",
118-
"HAVING",
119-
"IF",
120-
"IMPORT",
121-
"IN",
122-
"INNER",
123-
"INSERT",
124-
"INT",
125-
"INTEGER",
126-
"INTERSECT",
127-
"INTERVAL",
128-
"INTO",
129-
"IS",
130-
"JOIN",
131-
"LATERAL",
132-
"LEFT",
133-
"LESS",
134-
"LIKE",
135-
"LOCAL",
136-
"MACRO",
137-
"MAP",
138-
"MORE",
139-
"NONE",
140-
"NOT",
141-
"NULL",
142-
"NUMERIC",
143-
"OF",
144-
"ON",
145-
"ONLY",
146-
"OR",
147-
"ORDER",
148-
"OUT",
149-
"OUTER",
150-
"OVER",
151-
"PARTIALSCAN",
152-
"PARTITION",
153-
"PERCENT",
154-
"PRECEDING",
155-
"PRECISION",
156-
"PRESERVE",
157-
"PRIMARY",
158-
"PROCEDURE",
159-
"RANGE",
160-
"READS",
161-
"REDUCE",
162-
"REFERENCES",
163-
"REGEXP",
164-
"REVOKE",
165-
"RIGHT",
166-
"RLIKE",
167-
"ROLLBACK",
168-
"ROLLUP",
169-
"ROW",
170-
"ROWS",
171-
"SELECT",
172-
"SET",
173-
"SMALLINT",
174-
"START",
175-
"TABLE",
176-
"TABLESAMPLE",
177-
"THEN",
178-
"TIME",
179-
"TIMESTAMP",
180-
"TO",
181-
"TRANSFORM",
182-
"TRIGGER",
183-
"TRUE",
184-
"TRUNCATE",
185-
"UNBOUNDED",
186-
"UNION",
187-
"UNIQUEJOIN",
188-
"UPDATE",
189-
"USER",
190-
"USING",
191-
"UTC_TIMESTAMP",
192-
"VALUES",
193-
"VARCHAR",
194-
"VIEWS",
195-
"WHEN",
196-
"WHERE",
197-
"WINDOW",
198-
"WITH",
199-
}
200-
# https://docs.aws.amazon.com/athena/latest/ug/reserved-words.html#list-of-reserved-words-sql-select
201-
SELECT_STATEMENT_RESERVED_WORDS: Set[str] = {
202-
"ALL",
203-
"ALTER",
204-
"AND",
205-
"ARRAY",
206-
"AS",
207-
"AUTHORIZATION",
208-
"BETWEEN",
209-
"BIGINT",
210-
"BINARY",
211-
"BOOLEAN",
212-
"BOTH",
213-
"BY",
214-
"CASE",
215-
"CASHE",
216-
"CAST",
217-
"CHAR",
218-
"COLUMN",
219-
"COMMIT",
220-
"CONF",
221-
"CONSTRAINT",
222-
"CREATE",
223-
"CROSS",
224-
"CUBE",
225-
"CURRENT",
226-
"CURRENT_DATE",
227-
"CURRENT_TIMESTAMP",
228-
"CURSOR",
229-
"DATABASE",
230-
"DATE",
231-
"DAYOFWEEK",
232-
"DECIMAL",
233-
"DELETE",
234-
"DESCRIBE",
235-
"DISTINCT",
236-
"DOUBLE",
237-
"DROP",
238-
"ELSE",
239-
"END",
240-
"EXCHANGE",
241-
"EXISTS",
242-
"EXTENDED",
243-
"EXTERNAL",
244-
"EXTRACT",
245-
"FALSE",
246-
"FETCH",
247-
"FLOAT",
248-
"FLOOR",
249-
"FOLLOWING",
250-
"FOR",
251-
"FOREIGN",
252-
"FROM",
253-
"FULL",
254-
"FUNCTION",
255-
"GRANT",
256-
"GROUP",
257-
"GROUPING",
258-
"HAVING",
259-
"IF",
260-
"IMPORT",
261-
"IN",
262-
"INNER",
263-
"INSERT",
264-
"INT",
265-
"INTEGER",
266-
"INTERSECT",
267-
"INTERVAL",
268-
"INTO",
269-
"IS",
270-
"JOIN",
271-
"LATERAL",
272-
"LEFT",
273-
"LESS",
274-
"LIKE",
275-
"LOCAL",
276-
"MACRO",
277-
"MAP",
278-
"MORE",
279-
"NONE",
280-
"NOT",
281-
"NULL",
282-
"NUMERIC",
283-
"OF",
284-
"ON",
285-
"ONLY",
286-
"OR",
287-
"ORDER",
288-
"OUT",
289-
"OUTER",
290-
"OVER",
291-
"PARTIALSCAN",
292-
"PARTITION",
293-
"PERCENT",
294-
"PRECEDING",
295-
"PRECISION",
296-
"PRESERVE",
297-
"PRIMARY",
298-
"PROCEDURE",
299-
"RANGE",
300-
"READS",
301-
"REDUCE",
302-
"REFERENCES",
303-
"REGEXP",
304-
"REVOKE",
305-
"RIGHT",
306-
"RLIKE",
307-
"ROLLBACK",
308-
"ROLLUP",
309-
"ROW",
310-
"ROWS",
311-
"SELECT",
312-
"SET",
313-
"SMALLINT",
314-
"START",
315-
"TABLE",
316-
"TABLESAMPLE",
317-
"THEN",
318-
"TIME",
319-
"TIMESTAMP",
320-
"TO",
321-
"TRANSFORM",
322-
"TRIGGER",
323-
"TRUE",
324-
"TRUNCATE",
325-
"UNBOUNDED",
326-
"UNION",
327-
"UNIQUEJOIN",
328-
"UPDATE",
329-
"USER",
330-
"USING",
331-
"UTC_TIMESTAMP",
332-
"VALUES",
333-
"VARCHAR",
334-
"VIEWS",
335-
"WHEN",
336-
"WHERE",
337-
"WINDOW",
338-
"WITH",
339-
}
340-
RESERVED_WORDS: Set[str] = set(DDL_RESERVED_WORDS | SELECT_STATEMENT_RESERVED_WORDS)
34159

34260
ischema_names: Dict[str, Type[Any]] = {
34361
"boolean": types.BOOLEAN,

0 commit comments

Comments
 (0)