diff options
Diffstat (limited to 'sqlglot/optimizer/normalize_identifiers.py')
-rw-r--r-- | sqlglot/optimizer/normalize_identifiers.py | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/sqlglot/optimizer/normalize_identifiers.py b/sqlglot/optimizer/normalize_identifiers.py new file mode 100644 index 0000000..1e5c104 --- /dev/null +++ b/sqlglot/optimizer/normalize_identifiers.py @@ -0,0 +1,36 @@ +from sqlglot import exp +from sqlglot._typing import E +from sqlglot.dialects.dialect import RESOLVES_IDENTIFIERS_AS_UPPERCASE, DialectType + + +def normalize_identifiers(expression: E, dialect: DialectType = None) -> E: + """ + Normalize all unquoted identifiers to either lower or upper case, depending on + the dialect. This essentially makes those identifiers case-insensitive. + + Example: + >>> import sqlglot + >>> expression = sqlglot.parse_one('SELECT Bar.A AS A FROM "Foo".Bar') + >>> normalize_identifiers(expression).sql() + 'SELECT bar.a AS a FROM "Foo".bar' + + Args: + expression: The expression to transform. + dialect: The dialect to use in order to decide how to normalize identifiers. + + Returns: + The transformed expression. + """ + return expression.transform(_normalize, dialect, copy=False) + + +def _normalize(node: exp.Expression, dialect: DialectType = None) -> exp.Expression: + if isinstance(node, exp.Identifier) and not node.quoted: + node.set( + "this", + node.this.upper() + if dialect in RESOLVES_IDENTIFIERS_AS_UPPERCASE + else node.this.lower(), + ) + + return node |