课程中的代码是这样的
elif isinstance(target, Identifier):
# 处理是一个具体的列名的情况
# 一个小改进点: 这个target.parts是可以包含'.'的(表名(或表的别名).列名), 例如: t1.name
# 我们不考虑这种场景, 要求用户必须指定表名, 否则报错
# 如果用户不显式指定表名, 在join同名字段的时候, 会报错, 麻烦
full_name = target.parts
if '.' not in full_name:
raise SQLLogicalPlanError('please set a specific table name')
# t1.name -> t1, name
table_name, column = full_name.split('.')
target_list.append(TableColumn(table_name, column))
疑惑点在于 '.‘的处理,这个就必须强制用户传入的SQL语句的列表必须带有表名(因为不带’.'这里直接raise error了,前面的parser代码也没有看到有对这个列名和表名进行join的操作)
如:
SELECT t1.a FROM t1
如果不带 ’.’ , 那么SQL就是这样传
SELECT a FROM t1
但如果不带‘.’,代码里面就直接raise error了(前面的parser代码也没有看到有对这个列名和表名进行join的操作)