PayasR / paralite

0 stars 0 forks source link

JOINと'USING'で例外 #34

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
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