sql-error-categorizer 0.2.1__tar.gz → 0.2.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/PKG-INFO +2 -2
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/pyproject.toml +2 -2
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/requirements.txt +1 -1
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/src/sql_error_categorizer/detectors/complications.py +1 -1
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/src/sql_error_categorizer/detectors/logical.py +3 -2
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/src/sql_error_categorizer/detectors/syntax.py +1 -1
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/3_log/test_073_missing_as_from_select.py +21 -1
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/.gitignore +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/.readthedocs.yaml +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/LICENSE +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/Makefile +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/README.md +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/datasets/catalogs/constraints.json +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/datasets/catalogs/miedema.json +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/datasets/sql/constraints.sql +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/datasets/sql/miedema.sql +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/docs/Makefile +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/docs/conf.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/docs/index.rst +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/docs/make.bat +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/docs/requirements.txt +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/src/sql_error_categorizer/__init__.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/src/sql_error_categorizer/detectors/__init__.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/src/sql_error_categorizer/detectors/base.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/src/sql_error_categorizer/detectors/semantic.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/test_detector.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_002_ambiguous_column.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_004_undefined_column.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_005_undefined_function.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_006_undefined_parameter.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_007_undefined_tables.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_008_invalid_schema_names.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_009_misspellings.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_013_data_type_mismatch.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_014_aggregate_function_outside_select_or_having.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_015_nested_aggregate_functions.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_016_extraneous_omitted_grouping_column.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_017_having_without_group_by.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_019_using_where_twice.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_020_missing_from.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_021_comparison_with_null.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_022_038_additional_omitted_semicolons.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_024_duplicate_clause.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_026_too_many_columns_in_subquery.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_030_keywords_order.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_034_curly_square_or_unmatched_brackets.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_035_is_where_not_applicable.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_037_nonstandard_operators.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/2_sem/test_040_tautological_inconsistent_expressions.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/2_sem/test_041_distinct_sum_avg.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/2_sem/test_043_wildcards_without_like.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/2_sem/test_044_incorrect_wildcards.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/3_log/test_058_join_on_incorrect_table.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/3_log/test_059_join_when_join_needs_to_be_omitted.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/3_log/test_062_missing_join.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/3_log/test_070_extraneous_column_in_select.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/3_log/test_071_missing_column_from_select.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/3_log/test_072_missing_distinct_from_select.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/4_com/test_083_unnecessary_distinct_in_select.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/4_com/test_088_like_no_wildcards.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/4_com/test_092_unnecessary_distinct_in_aggregate_function.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/4_com/test_095_group_by_with_singleton_groups.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/4_com/test_097_group_by_can_be_replaced_by_distinct.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/4_com/test_100_order_by_in_subquery.py +0 -0
- {sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sql_error_categorizer
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.3
|
|
4
4
|
Summary: This project analyses SQL statements and labels possible errors or complications.
|
|
5
5
|
Project-URL: Repository, https://github.com/DavidePonzini/sql_error_categorizer
|
|
6
6
|
Project-URL: Documentation, https://sql-error-categorizer.readthedocs.io/en/latest/index.html
|
|
@@ -17,7 +17,7 @@ Requires-Dist: pyyaml
|
|
|
17
17
|
Requires-Dist: sql-error-taxonomy
|
|
18
18
|
Requires-Dist: sqlglot
|
|
19
19
|
Requires-Dist: sqlparse
|
|
20
|
-
Requires-Dist: sqlscope
|
|
20
|
+
Requires-Dist: sqlscope>=1.0.14
|
|
21
21
|
Requires-Dist: z3-solver
|
|
22
22
|
Description-Content-Type: text/markdown
|
|
23
23
|
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "sql_error_categorizer"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.3"
|
|
8
8
|
authors = [
|
|
9
9
|
{ name="Davide Ponzini", email="davide.ponzini95@gmail.com" },
|
|
10
10
|
]
|
|
@@ -21,7 +21,7 @@ dependencies = [
|
|
|
21
21
|
"pyyaml",
|
|
22
22
|
"sqlparse",
|
|
23
23
|
"sqlglot",
|
|
24
|
-
"sqlscope",
|
|
24
|
+
"sqlscope>=1.0.14",
|
|
25
25
|
"sql_error_taxonomy",
|
|
26
26
|
"z3-solver",
|
|
27
27
|
"python-dateutil",
|
|
@@ -342,7 +342,7 @@ class ComplicationDetector(BaseDetector):
|
|
|
342
342
|
checked_subqueries: set[str] = set()
|
|
343
343
|
|
|
344
344
|
for select in self.query.selects:
|
|
345
|
-
for subquery, clause in select.subqueries:
|
|
345
|
+
for subquery, clause, depth in select.subqueries:
|
|
346
346
|
if subquery.sql in checked_subqueries:
|
|
347
347
|
continue
|
|
348
348
|
|
|
@@ -448,8 +448,9 @@ class LogicalErrorDetector(BaseDetector):
|
|
|
448
448
|
if extraneous_columns or missing_columns:
|
|
449
449
|
return results # skip AS check if column count is already wrong
|
|
450
450
|
|
|
451
|
-
|
|
452
|
-
|
|
451
|
+
# only consider columns that are actually aliased
|
|
452
|
+
expected_aliases: set[str] = set.intersection(*[set(col.name for col in sol.main_query.output.columns if col.name != col.real_name and not col.name.startswith('_')) for sol in self.solutions])
|
|
453
|
+
provided_aliases: set[str] = set(col.name for col in self.query.main_query.output.columns if col.name != col.real_name and not col.name.startswith('_'))
|
|
453
454
|
|
|
454
455
|
missing_aliases = expected_aliases - provided_aliases
|
|
455
456
|
|
|
@@ -967,7 +967,7 @@ class SyntaxErrorDetector(BaseDetector):
|
|
|
967
967
|
results: list[DetectedError] = []
|
|
968
968
|
|
|
969
969
|
for select in self.query.selects:
|
|
970
|
-
for subquery, clause in select.subqueries:
|
|
970
|
+
for subquery, clause, depth in select.subqueries:
|
|
971
971
|
if clause in ('FROM', 'EXISTS'):
|
|
972
972
|
continue # FROM/EXISTS subqueries can have any number of columns
|
|
973
973
|
|
|
@@ -14,7 +14,21 @@ ERROR = SqlErrors.LOG_73_MISSING_AS_FROM_SELECT
|
|
|
14
14
|
'SELECT cid, cname AS street FROM customer;',
|
|
15
15
|
['SELECT cid AS id, cname FROM customer;'],
|
|
16
16
|
'miedema',
|
|
17
|
-
['id'
|
|
17
|
+
['id']
|
|
18
|
+
),
|
|
19
|
+
|
|
20
|
+
(
|
|
21
|
+
'SELECT cid, cname AS street FROM customer;',
|
|
22
|
+
['SELECT cid AS id, cname AS street2 FROM customer;'],
|
|
23
|
+
'miedema',
|
|
24
|
+
['id', 'street2']
|
|
25
|
+
),
|
|
26
|
+
(
|
|
27
|
+
# aliased aggregate in solution (should trigger AS error)
|
|
28
|
+
'SELECT a AS b, COUNT(*) FROM table1 GROUP BY a;',
|
|
29
|
+
['SELECT a AS b, COUNT(*) AS c FROM table1 GROUP BY a;'],
|
|
30
|
+
None,
|
|
31
|
+
['c']
|
|
18
32
|
)
|
|
19
33
|
# subqueries -- Not applicable
|
|
20
34
|
# CTEs -- Not applicable
|
|
@@ -54,6 +68,12 @@ def test_wrong(query, solutions, schema, expected):
|
|
|
54
68
|
[],
|
|
55
69
|
None,
|
|
56
70
|
),
|
|
71
|
+
(
|
|
72
|
+
# unaliased aggregate in solution (should not trigger AS error)
|
|
73
|
+
'SELECT a AS b, COUNT(*) AS c FROM table1 GROUP BY a;',
|
|
74
|
+
['SELECT a AS b, COUNT(*) FROM table1 GROUP BY a;'],
|
|
75
|
+
None,
|
|
76
|
+
),
|
|
57
77
|
# subqueries -- Not applicable
|
|
58
78
|
# CTEs -- Not applicable
|
|
59
79
|
])
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/datasets/catalogs/constraints.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/src/sql_error_categorizer/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_002_ambiguous_column.py
RENAMED
|
File without changes
|
{sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_004_undefined_column.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_007_undefined_tables.py
RENAMED
|
File without changes
|
|
File without changes
|
{sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_009_misspellings.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_020_missing_from.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_024_duplicate_clause.py
RENAMED
|
File without changes
|
|
File without changes
|
{sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/1_syn/test_030_keywords_order.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/2_sem/test_041_distinct_sum_avg.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sql_error_categorizer-0.2.1 → sql_error_categorizer-0.2.3}/tests/3_log/test_062_missing_join.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|