What steps will reproduce the problem?
● ステータス:修正済み
● 現象
・JOIN結合で'USING'を使ったselect文(下記
Ex.1)を実行すると、例外が発生する。
Ex.1)
$ paralite a.db "select x.a, y.b from x join y USING(a)"
● 再現手順
Ex.2) まず、テーブルを2つ作成する
$ paralite a.db "create table x(a, b)"
$ paralite a.db "create table y(a, b)"
Ex.3) 実行すると例外が発生する
$ paralite a.db "select x.a, y.b from x join y USING(a)"
↓
ERROR: Traceback (most recent call last):
File "/home/takizawa/paralite-read-only/ParaLite-3.0/bin/m_paraLite.py", line 751, in mk_select_plan
plan, error_type, error_info = self.make_select(stmt_dic)
File "/home/takizawa/paralite-read-only/ParaLite-3.0/bin/m_paraLite.py", line 843, in make_select
node_join = self.get_WHERE_CLAUSE_node(ele[3])
File "/home/takizawa/paralite-read-only/ParaLite-3.0/bin/m_paraLite.py", line 1430, in get_WHERE_CLAUSE_node
node = self.get_WHERE_node(where)
File "/home/takizawa/paralite-read-only/ParaLite-3.0/bin/m_paraLite.py", line 1369, in get_WHERE_node
child.expression = tables[0]
IndexError: list index out of range
What is the expected output? What do you see instead?
● 期待される出力
Ex.4) あるべき出力結果
$ paralite a.db "select x.a, y.b from x join y USING(a)"
↓
ERROR: ERROR: ParaLite does not support a query with JOIN and USING clause
Please use labels and text to provide additional information.
● 原因
・JOIN文に"USING"があるクエリに対応していないため、"USING
"がテーブルとして処理され、実際には"USING"テーブルがない
ので例外が発生している。
・Issue32(外部結合とアスタリスク(*)で例外)と同様に、�
��エリ内に'join'と'USING'が出てきた場合は、エラーメッセー��
�を返すように修正した。
・m_paraLite.pyファイル 777行目「if ele[0].lower() == "join" or
ele[0].lower().find(" join") !=
-1:」の後ろに、新規作成したエラーメッセージ(5007行目「sel
f.JOIN_USING_ERROR」)が返るように修正した。
● 修正箇所
◆ bin/m_paraLite.py / def make_select(self, stmt_dic):
< before >
for ele in srclist:
if isinstance(ele[0], str):
# the first table or join
if ele[0].lower() == "join" or ele[0].lower().find(" join") != -1:
# takizawa:Issue33: 下記の2行を追加。Join使用時に'*'が出たら、エラーにする。
if '*' in stmt_dic["select"]:
return None, 1, ParaLiteException().ASTERISK_JOIN_ERROR
# join a table
if first_node is None:
first_node = BasicOp()
first_node.name = Operator.AND
< after >
for ele in srclist:
if isinstance(ele[0], str):
# the first table or join
if ele[0].lower() == "join" or ele[0].lower().find(" join") != -1:
# takizawa:Issue33: 下記の2行を追加。Join使用時に'*'が出たら、エラーにする。
if '*' in stmt_dic["select"]:
return None, 1, ParaLiteException().ASTERISK_JOIN_ERROR
# takizawa:Issue34: 下記の2行を追加。Join使用時に'using'が出たら、エラーにする。
if "using" in (st.lower() for st in flatten(ele)):
return None, 1, ParaLiteException().JOIN_USING_ERROR
# join a table
if first_node is None:
first_node = BasicOp()
first_node.name = Operator.AND
◆ bin/m_paraLite.py / class ParaLiteException: / def __init__(self):
< before >
self.NON_EQUI_JOIN_ERROR = "ERROR: ParaLite cannot support this query with JOIN operations other than Equi-JOIN"
# takizawa:Issue32: 下記の1行を追加。JOIN使用時、アスタリスクは複数テーブルでは使えません。
self.ASTERISK_JOIN_ERROR = "ERROR: * is allowed only on a single table"
< after >
self.NON_EQUI_JOIN_ERROR = "ERROR: ParaLite cannot support this query with JOIN operations other than Equi-JOIN"
# takizawa:Issue32: 下記の1行を追加。JOIN使用時、アスタリスクは複数テーブルでは使えません。
self.ASTERISK_JOIN_ERROR = "ERROR: * is allowed only on a single table"
# takizawa:Issue34: 下記の1行を追加。JOIN使用時、'USING'は使えません。
self.JOIN_USING_ERROR = "ERROR: ParaLite does not support a query with JOIN and USING clause"
Original issue reported on code.google.com by wdb.taki...@gmail.com on 24 Dec 2014 at 2:54
Original issue reported on code.google.com by
wdb.taki...@gmail.com
on 24 Dec 2014 at 2:54