[s2container-php5:89] Re: /*IF */ ... --ELSE ... /*END*/の使用方法について

Yusuke Hata [E-MAIL ADDRESS DELETED]
2007年 4月 5日 (木) 00:04:50 JST


黒田さん
ハタです。こんばんわ

> 下の方はwhere句が全く生成されていませんでした。
> 
> $result = $this->dao->getFormatByIdWeight2List(1, 100);
> //SELECT 〜省略 FROM formats WHERE formats.id =1and formats.weight=100
> 
> $result = $this->dao->getFormatByIdWeight2List(1, null);
> //actual: SELECT 〜省略 FROM formats
> //expect: SELECT 〜省略 FROM formats WHERE formats.id = 1
> 
> 
> つまり、--ELSEを持たないIFコメントを持つクエリで、
> IFコメントより前に他の条件がある場合、
> IF条件が偽になるような条件を与えると、
> IFコメント以前も無視されてしまっているように見えます。

たしかにおかしな出力になってしまっていますね...
前回の対応で、ELSEの前評価を行うようにしている部分がある(/*IF*//*IF*/--ELSE/*END*//*END*/の対応)ので
もしかするとその部分に引っ張られてしまってバグってしまっているかもしれません。
# というかIF評価を待つ前に次の評価を完了させている(?)

テスト不十分でした。
次のリリースで修正します。
# 他にも修正する部分がでてきたので、それと一緒に修正 & リリースを行います。

以上です。よろしくお願いします。

kuroda <[E-MAIL ADDRESS DELETED]> wrote:

> ハタ様
> 
> 大変遅くなりましたが、
> 下記環境にて、修正して頂いた点を確認いたしましまた。
> 対応ありがとうございました。
> 
> S2Container.php5-1.1.3
> S2Dao.php-1.1.2
> 
> そこで、今回問題だった点はクリアされたのですが、
> 他のテストを行ってみたところ、今度は別の不具合が出ています。
> 
> 今回の修正により下記一番上のメソッドの場合は上手く行くようになりました
> が、下記のうち、4つ目のgetFormatByIdWeight2List()だけは、希望通りのク
> エリが生成されない場合があるようです。
> 
> const getFormatByWeightList_QUERY = '/*IF weight !=
> null*/formats.weight=/*weight*/0 --ELSE formats.weight is
> null/*END*/'; public function getFormatByWeightList($weight = null);
> 
> const getFormatByIdWeightList_QUERY = 'formats.id =/*id*/0 and /*IF
> weight != null*/formats.weight=/*weight*/0 --ELSE formats.weight is
> null/*END*/'; public function getFormatByIdWeightList($id = null,
> $weight = null);
> 
> const getFormatByWeight2List_QUERY = '/*IF weight !=
> null*/formats.weight=/*weight*/0/*END*/'; public function
> getFormatByWeight2List($weight = null);
> 
> const getFormatByIdWeight2List_QUERY = 'formats.id =/*id*/0/*IF
> weight != null*/ and formats.weight=/*weight*/0/*END*/'; public
> function getFormatByIdWeight2List($id = null, $weight = null);
> 
> 例えば、下記の2パターンで呼び出すと、上は上手く行きますが、
> 下の方はwhere句が全く生成されていませんでした。
> 
> $result = $this->dao->getFormatByIdWeight2List(1, 100);
> //SELECT 〜省略 FROM formats WHERE formats.id =1and formats.weight=100
> 
> $result = $this->dao->getFormatByIdWeight2List(1, null);
> //actual: SELECT 〜省略 FROM formats
> //expect: SELECT 〜省略 FROM formats WHERE formats.id = 1
> 
> 
> つまり、--ELSEを持たないIFコメントを持つクエリで、
> IFコメントより前に他の条件がある場合、
> IF条件が偽になるような条件を与えると、
> IFコメント以前も無視されてしまっているように見えます。
> 
> お手数お掛けいたしますが御確認、よろしくお願いいたします。
> 
> 黒田
> 
> 
> On Fri, 9 Feb 2007 02:42:00 +0900
> Yusuke Hata <[E-MAIL ADDRESS DELETED]> wrote:
> 
> > 黒田様
> > 
> > ハタです。ファイルありがとうございました。
> > 
> > こちらでも再現致しました。
> > formats.weightとすると、"formats." にあるドット周辺のパースが上手く
> > 行えていないようでした。
> > # hoge.weightは上手くいったので何か別の理由があるかもしれません
> > 原因はSqlTokenizerと考えています。
> > 
> > これの修正は、S2Dao.PHP5-1.1.2のリリースをもって反映したいと思いま
> > す。 see: https://www.seasar.org/issues/browse/DAOPHP-8
> > 
> > また、修正とは別になってしまいますが、以下のようにテーブル名の指定を
> > 行わない方法で一時的に回避可能です。
> > 
> >     const getFormatByWeight3List_QUERY = "weight /*IF weight !=
> > null*/=/*weight*/0 --ELSE is null/*END*/"; public function
> > getFormatByWeight3List($weight = null);
> > 
> >     const getFormatByWeight2List_QUERY = "/*IF weight !=
> > null*/weight=/*weight*/0 --ELSE isnull(weight)/*END*/"; public
> > function getFormatByWeight2List($weight = null);
> > 
> >     const getFormatByWeightList_QUERY = "/*IF weight !=
> > null*/weight = /*weight*/0 --ELSE weight is null/*END*/"; public
> > function getFormatByWeightList($weight = null);
> > 
> > すいませんが、S2Dao.PHP5-1.1.2のリリースがされるまでは上記の方法で対
> > 応していただけませんでしょうか?また、リリースの日程は未定です。
> > 
> > 以上です。よろしくお願いします。
> > 
> > On Thu, 08 Feb 2007 02:51:48 +0900
> > Eishi Kuroda <[E-MAIL ADDRESS DELETED]> wrote:
> > 
> > > ハタ様
> > > 
> > > たった今、下記の方法を試してみましたが、
> > > 
> > > ------- <<ここから>> -------
> > > /*IF hoge != null*/hoge = /*hoge*/'abc'
> > >   -- ELSE hoge is null
> > >  # --[ここに半角スペース]ELSE hoge is null
> > > /*END*/
> > > ------- <</ここまで>> -------
> > > 
> > > 例えば下記のようになり、無理でした。
> > > 
> > > SELECT formats.id, formats.name, formats.name_en, formats.weight,
> > > formats.entry, formats.version_no, formats.timestamp FROM formats
> > > WHERE 100 -- ELSE formats.weight is null
> > > 
> > > よろしくお願いします。
> > > 
> > > 黒田
> > > 
> > > On Thu, 08 Feb 2007 02:46:12 +0900
> > > Eishi Kuroda <[E-MAIL ADDRESS DELETED]> wrote:
> > > 
> > > > ハタ様
> > > > 
> > > > 御対応ありがとうございます。
> > > > 
> > > > > また、リファレンスに載せているコードですが、一部DBMSで正常に動
> > > > > かないことがあるので以下のように修正することで動く可能性があり
> > > > > ます。
> > > > 
> > > > ↑こちらはまだ試してないのですが、
> > > > とりあえず、私の方で試した時のコードとデータを出来る限り送りま
> > > > す。
> > > > 
> > > > pdo.dicon以外はほぼそのまま送っていますが、一部削った所もありま
> > > > す。ただし、そのせいで問題の点の挙動が変わることはないと思いま
> > > > す。
> > > > 
> > > > www/formats.sql
> > > > が、テーブルとデータ数個分のsql。
> > > > 
> > > > www/lib/dao
> > > > www/lib/entity
> > > > にformatsのdao, entity。
> > > > 
> > > > これで役に立つかどうか分かりませんが、
> > > > よろしくお願いいたします。
> > > > 
> > > > 黒田映史
> > > > 
> > > > 
> > > > On Thu, 8 Feb 2007 00:01:34 +0900
> > > > Yusuke Hata <[E-MAIL ADDRESS DELETED]> wrote:
> > > > 
> > > > > ハタです。遅くなってしまって申し訳ありません。
> > > > > 
> > > > > で、結果なのですが、すいません、私の環境(後記)では全て動いてし
> > > > > まいます(@@;; もし差し支えなければ、データやコードを私の方に
> > > > > 送っていただければ検証してみますので、送っていただけませんで
> > > > > しょうか?一部だけでも構わないです。私の方でも、もう少し原因を
> > > > > 追ってみます。
> > > > > 
> > > > > SQLバインドの使い方はgetFormatByWeightListや
> > > > > getFormatByWeight2List の使い方で正しいハズです。
> > > > > 
> > > > > 以下は、その時のログになります。
> > > > > ------- <<ここから>> -------
> > > > > [DEBUG]  - SELECT hoge.id, hoge.weight, hoge.aaa, hoge.bbb
> > > > > FROM hoge WHERE hoge.weight=100 object(S2Dao_ArrayList)#454
> > > > > (1) { [0]=>
> > > > >   object(HogeEntity)#457 (4) {
> > > > >     :
> > > > >   }
> > > > > }
> > > > > [DEBUG]  - SELECT hoge.id, hoge.weight, hoge.aaa, hoge.bbb
> > > > > FROM hoge WHERE hoge.weight is null object(S2Dao_ArrayList)
> > > > > #453 (0) { }
> > > > > [DEBUG]  - SELECT hoge.id, hoge.weight, hoge.aaa, hoge.bbb
> > > > > FROM hoge WHERE hoge.weight=100 object(S2Dao_ArrayList)#446
> > > > > (1) { [0]=>
> > > > >   object(HogeEntity)#456 (4) {
> > > > >     :
> > > > >   }
> > > > > }
> > > > > [DEBUG]  - SELECT hoge.id, hoge.weight, hoge.aaa, hoge.bbb
> > > > > FROM hoge WHERE isnull(hoge.weight) object(S2Dao_ArrayList)
> > > > > #445 (0) { }
> > > > > [DEBUG]  - SELECT hoge.id, hoge.weight, hoge.aaa, hoge.bbb
> > > > > FROM hoge WHERE hoge.weight =100 object(S2Dao_ArrayList)#353
> > > > > (1) { [0]=>
> > > > >   object(HogeEntity)#455 (4) {
> > > > >     :
> > > > >   }
> > > > > }
> > > > > [DEBUG]  - SELECT hoge.id, hoge.weight, hoge.aaa, hoge.bbb
> > > > > FROM hoge WHERE hoge.weight is null object(S2Dao_ArrayList)
> > > > > #447 (0) { }
> > > > > ------- <</ここまで>> -------
> > > > > 
> > > > > また、リファレンスに載せているコードですが、一部DBMSで正常に動
> > > > > かないことがあるので以下のように修正することで動く可能性があり
> > > > > ます。
> > > > > 
> > > > > ------- <<ここから>> -------
> > > > > /*IF hoge != null*/hoge = /*hoge*/'abc'
> > > > >   -- ELSE hoge is null
> > > > >  # --[ここに半角スペース]ELSE hoge is null
> > > > > /*END*/
> > > > > ------- <</ここまで>> -------
> > > > > 
> > > > > 
> > > > > 以下は作成してみたモノです。
> > > > > 
> > > > > interface HogeDao {
> > > > >     const BEAN = "HogeEntity";
> > > > >     const getFormatByWeightList_QUERY = '/*IF weight !=
> > > > > null*/hoge.weight=/*weight*/0 --ELSE hoge.weight is
> > > > > null/*END*/'; public function getFormatByWeightList($weight =
> > > > > null);
> > > > > 
> > > > >     const getFormatByWeight2List_QUERY = '/*IF weight !=
> > > > > null*/hoge.weight=/*weight*/0 --ELSE isnull
> > > > > (hoge.weight)/*END*/'; public function getFormatByWeight2List
> > > > > ($weight = null);
> > > > > 
> > > > >     const getFormatByWeight3List_QUERY = 'hoge.weight /*IF
> > > > > weight != null*/=/*weight*/0 --ELSE is null/*END*/'; public
> > > > > function getFormatByWeight3List($weight = null); }
> > > > > 
> > > > > class HogeEntity {
> > > > >     const TABLE = "hoge";
> > > > >     private $id;
> > > > >     private $weight;
> > > > >     private $aaa;
> > > > >     private $bbb;
> > > > >     :(setter/getterなので省略)
> > > > > }
> > > > > create table hoge(
> > > > >     id integer not null auto_increment,
> > > > >     weight varchar(255) not null,
> > > > >     aaa varchar(255),
> > > > >     bbb varchar(255),
> > > > >     primary key(id)
> > > > > );
> > > > > 
> > > > > 私の環境は以下になります。(なるべく合わせてみました)
> > > > > OpenSuSE 10.2
> > > > > PHP 5.1.6
> > > > > MySql 5.0.26
> > > > > S2Dao.PHP5 1.1.1
> > > > > S2Container.PHP5 1.1.1
> > > > > 
> > > > > 以上です。よろしくお願いします。
> > > > > 
> > > 
> > > 
> > 
> > 
> > -- 
> > Yusuke Hata <[E-MAIL ADDRESS DELETED]>
> > blog: http://blog.xole.net/
> > _______________________________________________
> > S2Container-PHP5 mailing list
> > [E-MAIL ADDRESS DELETED]
> > https://ml.seasar.org/mailman/listinfo/s2container-php5
> > 
> > 
> > 
> > -- 
> > No virus found in this incoming message.
> > Checked by AVG Free Edition.
> > Version: 7.5.432 / Virus Database: 268.17.30/674 - Release Date:
> > 2007/02/07 15:33
> 
> -------------------------------------------
> KURODA Eishi
> [E-MAIL ADDRESS DELETED]
> FUTURAMA CO.,LTD. / JET SET
> 410-6F Shimomaruya-cho, Kawaramachi-Sanjo,
> Nakagyo-ku, Kyoto 604-8006 JAPAN
> tel/81-(0)75-253-3530 fax/81-(0)75-253-3532
> url/ http://www.jetsetrecords.net/
> -------------------------------------------
> 
> _______________________________________________
> S2Container-PHP5 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/s2container-php5


-- 
Yusuke Hata <[E-MAIL ADDRESS DELETED]>
blog: http://blog.xole.net/


S2Container-PHP5 メーリングリストの案内