Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New rule to flag special characters in identifiers #1958

Merged
merged 37 commits into from Nov 24, 2021
Merged
Show file tree
Hide file tree
Changes from 25 commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
17563bd
Rule: No special characters in names
Nov 22, 2021
1ddb72a
black
Nov 22, 2021
95ab483
Rule: No special characters in names
Nov 22, 2021
0cd2204
Rule: No special characters in names
Nov 22, 2021
b54d36f
Rule: No special characters in names
Nov 22, 2021
b15e657
Rule: No special characters in names
Nov 22, 2021
f7ac549
Rule: No special characters in names
Nov 22, 2021
f39bc7e
Rule: No special characters in names
Nov 22, 2021
61da351
Rule: No special characters in names
Nov 22, 2021
1be4ae1
Rule: No special characters in names
Nov 22, 2021
33d31a2
Rule: No special characters in names
Nov 22, 2021
1b3176d
Rule: No special characters in names
Nov 22, 2021
4b60dff
Rule: No special characters in names
Nov 22, 2021
f5c5385
Merge remote-tracking branch 'upstream/main' into Rule_Special_Charac…
Nov 22, 2021
8ecf051
Rule: No special characters in names
Nov 22, 2021
ffe22b0
Rule: No special characters in names
Nov 22, 2021
56a7d41
Rule: No special characters in names
Nov 22, 2021
a0b8a79
Rule: No special characters in names
Nov 22, 2021
6575670
Merge remote-tracking branch 'upstream/main' into Rule_Special_Charac…
Nov 23, 2021
a3c86a9
Rule: No special characters in names
Nov 23, 2021
b5c78cb
Rule: No special characters in names
Nov 23, 2021
41a3e92
Rule: No special characters in names
Nov 23, 2021
c3db5da
Rule: No special characters in names
Nov 23, 2021
134cffb
Merge remote-tracking branch 'upstream/main' into Rule_Special_Charac…
Nov 23, 2021
f4e9995
Merge remote-tracking branch 'upstream/main' into Rule_Special_Charac…
Nov 23, 2021
1c9e1fd
Merge remote-tracking branch 'upstream/main' into Rule_Special_Charac…
Nov 23, 2021
09ec766
Rule: Special Characters in names: code review results
Nov 23, 2021
e8afc8a
Rule: Special Characters in names: code review results
Nov 24, 2021
025f070
Rule: Special Characters in names: code review results
Nov 24, 2021
739c598
Rule: Special Characters in names: code review results
Nov 24, 2021
8ce6ed7
Merge remote-tracking branch 'upstream/main' into Rule_Special_Charac…
Nov 24, 2021
eeecca5
Rule: Special Characters in names: code review results
Nov 24, 2021
53ffeaf
Rule: Special Characters in names: code review results
Nov 24, 2021
f855823
Rule: Special Characters in names: code review results
Nov 24, 2021
14aeb05
Rule: Special Characters in names: code review results
Nov 24, 2021
a55794a
Merge remote-tracking branch 'upstream/main' into Rule_Special_Charac…
Nov 24, 2021
465f286
Merge branch 'main' into Rule_Special_Characters_In_Names
barrywhart Nov 24, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/sqlfluff/core/default_config.cfg
Expand Up @@ -96,3 +96,8 @@ require_final_semicolon = False

[sqlfluff:rules:L054] # GROUP BY/ORDER BY column references.
group_by_and_order_by_style = consistent

[sqlfluff:rules:L057] # Special characters in identifiers
unquoted_identifiers_policy = all
quoted_identifiers_policy = all
allow_space_in_identifier = False
4 changes: 4 additions & 0 deletions src/sqlfluff/core/rules/config_info.py
Expand Up @@ -124,6 +124,10 @@
"or implicit positional references"
),
},
"allow_space_in_identifier": {
"validation": [True, False],
"definition": ("Should spaces in identifiers be allowed?"),
},
}


Expand Down
92 changes: 92 additions & 0 deletions src/sqlfluff/rules/L057.py
@@ -0,0 +1,92 @@
"""Implementation of Rule L057."""

from typing import Optional

from sqlfluff.core.rules.base import BaseRule, LintResult, RuleContext
from sqlfluff.core.rules.doc_decorators import (
document_configuration,
document_fix_compatible,
jpers36 marked this conversation as resolved.
Show resolved Hide resolved
)
from sqlfluff.rules.L014 import identifiers_policy_applicable


@document_configuration
@document_fix_compatible
jpers36 marked this conversation as resolved.
Show resolved Hide resolved
class Rule_L057(BaseRule):
"""Do not use special characters in object names.
jpers36 marked this conversation as resolved.
Show resolved Hide resolved

The functionality for this rule is inherited from :obj:`Rule_L010`.
jpers36 marked this conversation as resolved.
Show resolved Hide resolved

| **Anti-pattern**
| Using special characters within names when creating or aliasing objects.
jpers36 marked this conversation as resolved.
Show resolved Hide resolved

.. code-block:: sql

CREATE TABLE DBO.ColumnNames
(
[Internal Space] INT,
[Greater>Than] INT,
[Less<Than] INT,
Number# INT
)

| **Best practice**
| Object names should include only alphanumerics and underscores.
jpers36 marked this conversation as resolved.
Show resolved Hide resolved

.. code-block:: sql

CREATE TABLE DBO.ColumnNames
(
[Internal_Space] INT,
[GreaterThan] INT,
[LessThan] INT,
NumberVal INT
)

"""

config_keywords = [
"quoted_identifiers_policy",
"unquoted_identifiers_policy",
"allow_space_in_identifier",
]

def _eval(self, context: RuleContext) -> Optional[LintResult]:
"""Do not use special characters in object names."""
if (
jpers36 marked this conversation as resolved.
Show resolved Hide resolved
(
context.segment.name == "naked_identifier"
and identifiers_policy_applicable(
self.unquoted_identifiers_policy, context.parent_stack # type: ignore
jpers36 marked this conversation as resolved.
Show resolved Hide resolved
)
and not (
context.segment.raw.replace("_", "").isalnum()
or (
self.allow_space_in_identifier # type: ignore
jpers36 marked this conversation as resolved.
Show resolved Hide resolved
and context.segment.raw.replace("_", "")
.replace(" ", "")
.isalnum()
)
)
)
) or (
(
context.segment.name == "quoted_identifier"
and identifiers_policy_applicable(
self.quoted_identifiers_policy, context.parent_stack # type: ignore
jpers36 marked this conversation as resolved.
Show resolved Hide resolved
)
and not (
context.segment.raw[1:-1].replace("_", "").isalnum()
or (
self.allow_space_in_identifier # type: ignore
jpers36 marked this conversation as resolved.
Show resolved Hide resolved
and context.segment.raw[1:-1]
jpers36 marked this conversation as resolved.
Show resolved Hide resolved
.replace("_", "")
.replace(" ", "")
.isalnum()
)
)
)
):
return LintResult(anchor=context.segment)
else:
return None
jpers36 marked this conversation as resolved.
Show resolved Hide resolved
81 changes: 81 additions & 0 deletions test/fixtures/rules/std_rule_cases/L057.yml
@@ -0,0 +1,81 @@
rule: L057

test_fail_special_chars_create_table_space:
fail_str:
CREATE TABLE DBO.ColumnNames
(
"Internal Space" INT
)

test_fail_special_chars_create_table_gt:
fail_str:
CREATE TABLE DBO.ColumnNames
(
"Greater>Than" INT
)

test_fail_special_chars_create_table_lt:
fail_str:
CREATE TABLE DBO.ColumnNames
(
"Less<Than" INT
)

test_fail_special_chars_create_table_hash_unquoted:
fail_str:
CREATE TABLE DBO.ColumnNames
(
Number# INT
)
configs:
core:
dialect: tsql

test_pass_special_chars_create_table_none:
pass_str:
CREATE TABLE DBO.ColumnNames
(
"No_Internal_Space" INT,
GreaterThan INT,
LessThan INT,
NumberVal INT
)

test_pass_special_chars_create_table_none_quoted_tsql:
pass_str:
CREATE TABLE DBO.ColumnNames
(
[No_Internal_Space] INT,
[GreaterThan] INT,
[LessThan] INT,
NumberVal INT
jpers36 marked this conversation as resolved.
Show resolved Hide resolved
)
configs:
core:
dialect: tsql


test_pass_special_chars_create_table_space_allowed:
pass_str:
CREATE TABLE DBO.ColumnNames
(
"Internal Space" INT
)
configs:
rules:
L057:
allow_space_in_identifier: True

test_fail_special_chars_alias:
fail_str:
SELECT a as "alias with space"
FROM DBO.ColumnNames

test_pass_special_chars_reference:
pass_str:
SELECT "column with space" as a
FROM DBO.ColumnNames
configs:
rules:
L057:
quoted_identifiers_policy: aliases
jpers36 marked this conversation as resolved.
Show resolved Hide resolved