MySQL25年&MyNA(ユーザ会)20年記念イベントを開催しました

 わざわざ普段のMySQL勉強会で「10年前はこんなのでした」「15年前のバージョンでこんなのがあってね」なんて話をする奴は、いない。やっぱりみんな、最新バージョンでどうなったのか、どう使っているのか、という話をしたいし、聞きたい。だからこそ、振り返りをコンセプトとする周年イベントは、開催したかった。

 今年2020年は、MySQLユーザ会(MyNA)が誕生してから20年目にあたります。3月上旬には20周年を記念するイベントを、SCSK様の協力で開催する予定でした。ご承知のとおり、COVID-19禍により3月の開催は中止としました。多くのコミュニティイベント類の中でもいち早く中止を決断して発表できたことは、自称ファインプレーだったな、とは思うものの、やはり開催したかったな、との思いが強かったのです。
sakaik.hateblo.jp


 今年2020年は、MySQL自体の25周年でもあります。5月23日が誕生日だったそうです。そんなわけで、OracleMySQLチームの方から「オンラインで合同でやらないか」とのお誘いをいただきました。実はそれが5月の連休明け。ユーザ会側の初動が少し遅れたものの、そこからはすごい勢いで日程、時間帯、コンセプト、スピーカー等等が決まっていきました。意見が出て、承認されて、自分がやるべきことをそれぞれが即座に受諾して、、、、という、このスピード感、気持ちよかったなぁ。仕事でもこんなふうだったら・・・(笑)。

 斯くして当日。 慣れないオンラインイベント故、うまく進行できるだろうか、歩留まり率(申込者に対する参加者数・言い換えるとドタキャン率)はどれくらいだろうか、と多くの不安がありましたがゲートオープンからたくさんの方が接続してくださり、最大時には100人を越える人が視聴していました(パネリスト含む)。 魅力的な各スピーカーの話の間はもちろん、ぐだぐだ感を演出した「パネルディスカッション風雑談」の間も、思ったほどの離脱はなく、ガマンしてくださっていたのか面白かったのかは知りませんが、数字の上では少しほっとしました。

 それにしても、オンラインイベントって難しいですね。どこに向かって話しているのか、わからない。私は、カメラのすぐ後ろが壁なので、壁にむかって語りかけている感じになり、実はかなりテンパっていました。 会全体の時間をとおして、どれくらいテンパっていたかというと、画面キャプチャを取り損なったくらい。すっかり忘れてた。日記書くときに必要なのにね~。進行役の役割としては「スピーカーの集合写真撮りましょう!」くらいやるべきだったと、反省しています。
 
 当日の雰囲気については、本日記末尾の Togetter まとめをご覧ください。MySQLの25年、MyNAの20年を支えてきた人たちの生のお話がどれだけ面白かったのかを感じていただけると思います。(動画公開も準備中です)

 普段私が色々な、セミナー形式のオンラインイベントに参加していて、不満というか、多少の寂しさを感じていたのが「セミナーが終了したら、ブチッと配信も止まってしまう」ということでした。オフラインのイベントでは、もう少し語りたい、聞きたい、という場合に2次会に移動したり、(会場が許せば)部屋や廊下で立ち話をしたりすることがありますよね。 折角同じ時間を共有したのだから、そんな立ち話をオンラインイベントでもやりたい、と考えていました。 今回は、21時45分頃にイベント本体を終了した後、22時20分頃まででしたかね、あれこれお喋りを続けていました。スピーカー以外でも希望する方は(今回、ウェビナー形式だったので)発言可能なステータスになってもらって、わいわいとやっていました。会話に入りたいわけじゃないけど聞いているのは好き、という方たちも、なんとなく残ってくれていたようで、こういう形式が今後のオンラインイベントで当たり前になるといいなぁと願っています。
 


 素晴らしいイベントで素晴らしいトークをしてくださった皆様、一緒に運営をしてくださった皆様、そして参加してくださったり途中からステージに上がってくださった皆様、どうもありがとうございます。またオンラインのイベントも継続的にやっていきたいですね。

 さて、今回のイベントの反応を見ていると、「俺にも語らせろ」という方が少なからずいらっしゃるようです。25年、20年、あるいは人によっては10年5年かもしれませんが、それぞれの「MySQLと過ごしてきた時間」というのがあります。いろんな立場から、いろんな思い出を聞けたら楽しそうですね。梶山さんも言っていたように「これから1年間は、25周年、20周年」ですので、今回のイベントを少しライトにした感じで、またやりましょうかね。 早ければ6月にでも。
語りたいネタをお持ちの方はぜひ整理しておいてください。今回同様、1人15分以内ということになるかと思います(ご希望に応じて5分枠も作りますので、普段話せない過去の話題などをぜひ)。


 なんか書き足りない気がするのだけど、とりあえず今日の所はこのへんで。
オフラインで飲食しながらわいわいやる時間は、それはそれで楽しみだったけど、オンラインにしたおかげで、地域に縛られないような、全国、いや海外まで参加していただけるようになって、これもいいなぁと思うようになりました。

イベントページ:
mysql.connpass.com

Togetter:
togetter.com

MySQLでCTEを使ってマンデルブロを描く

 MySQL に CTEが入ったんですよという話題の中で、PostgreSQLのCTEの定番でこんなものがあるんですよ、とPostgreSQLの(というかSRA OSSの)石井さんに教えていただきました。

Mandelbrot set - PostgreSQL wiki

 もちろんこのままではMySQLでは動かないのですが、少しの修正で動くようになったので、紹介します。

もとのSQL (PostgreSQL)

 上記サイトに掲載されていた PostgreSQL用のSQLです。実行結果は上記サイトを参照。きれいなマンデルブロートが出力されます。

WITH RECURSIVE
x(i)
AS (
    VALUES(0)
UNION ALL
    SELECT i + 1 FROM x WHERE i < 101
),
Z(Ix, Iy, Cx, Cy, X, Y, I)
AS (
    SELECT Ix, Iy, X::FLOAT, Y::FLOAT, X::FLOAT, Y::FLOAT, 0
    FROM
        (SELECT -2.2 + 0.031 * i, i FROM x) AS xgen(x,ix)
    CROSS JOIN
        (SELECT -1.5 + 0.031 * i, i FROM x) AS ygen(y,iy)
    UNION ALL
    SELECT Ix, Iy, Cx, Cy, X * X - Y * Y + Cx AS X, Y * X * 2 + Cy, I + 1
    FROM Z
    WHERE X * X + Y * Y < 16.0
    AND I < 27
),
Zt (Ix, Iy, I) AS (
    SELECT Ix, Iy, MAX(I) AS I
    FROM Z
    GROUP BY Iy, Ix
    ORDER BY Iy, Ix
)
SELECT array_to_string(
    array_agg(
        SUBSTRING(
            ' .,,,-----++++%%%%@@@@#### ',
            GREATEST(I,1),
            1
        )
    ),''
)
FROM Zt
GROUP BY Iy
ORDER BY Iy;

 

MySQL version (今回動くようにしたもの)

WITH RECURSIVE x(i) AS (
    VALUES ROW(0)
UNION ALL
    SELECT i + 1 FROM x WHERE i < 101
),
Z(Ix, Iy, Cx, Cy, X, Y, I)
AS (
    SELECT Ix, Iy, X, Y, X, Y, 0
    FROM
        (SELECT -2.2 + 0.031 * i, i FROM x) AS xgen(x,ix)
    CROSS JOIN
        (SELECT -1.5 + 0.031 * i, i FROM x) AS ygen(y,iy)
    UNION ALL
    SELECT Ix, Iy, Cx, Cy, X * X - Y * Y + Cx AS X, Y * X * 2 + Cy, I + 1
    FROM Z
    WHERE X * X + Y * Y < 16.0
    AND I < 27
),
Zt (Ix, Iy, I) AS (
    SELECT Ix, Iy, MAX(I) AS I
    FROM Z
    GROUP BY Iy, Ix
    ORDER BY Iy, Ix
)
SELECT array_to_string(
    array_agg(
        SUBSTRING(
            ' .,,,-----++++%%%%@@@@#### ',
            GREATEST(I,1),
            1
        )
    ),''
)
FROM Zt
GROUP BY Iy
ORDER BY Iy;

実行結果

mysql> WITH RECURSIVE x(i) AS (
    ->     VALUES ROW(0)
    -> UNION ALL
    ->     SELECT i + 1 FROM x WHERE i < 101
    -> ),
    -> Z(Ix, Iy, Cx, Cy, X, Y, I)
    -> AS (
    ->     SELECT Ix, Iy, X, Y, X, Y, 0
    ->     FROM
    ->         (SELECT -2.2 + 0.031 * i, i FROM x) AS xgen(x,ix)
    ->     CROSS JOIN
    ->         (SELECT -1.5 + 0.031 * i, i FROM x) AS ygen(y,iy)
    ->     UNION ALL
    ->     SELECT Ix, Iy, Cx, Cy, X * X - Y * Y + Cx AS X, Y * X * 2 + Cy, I + 1
    ->     FROM Z
    ->     WHERE X * X + Y * Y < 16.0
    ->     AND I < 27
    -> ),
    -> Zt (Ix, Iy, I) AS (
    ->     SELECT Ix, Iy, MAX(I) AS I
    ->     FROM Z
    ->     GROUP BY Iy, Ix
    ->     ORDER BY Iy, Ix
    -> )
    -> SELECT Iy, GROUP_CONCAT(s ORDER BY Ix)
    ->   FROM (
    ->     SELECT Iy, Ix, I, SUBSTRING(' .,,,-----++++%%%%@@@@#### ',I,1) s
    ->     FROM Zt
    ->   ) t
    -> GROUP BY Iy
    -> ORDER BY Iy;
+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Iy   | GROUP_CONCAT(s ORDER BY Ix)                                                                                                                                                                                 |
+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|    0 |  , , , , , , , , , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., , , , ,  |
|    1 |  , , , , , , , , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., , ,  |
|    2 |  , , , , , , , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., ,  |
|    3 |  , , , , , , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,  |
|    4 |  , , , , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|    5 |  , , , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|    6 |  , , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|    7 |  , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|    8 |  , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|    9 |  , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   10 |  , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   11 |  , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   12 |  ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   13 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,+,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   14 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   15 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-, ,-,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   16 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,+,+,-,-,+,+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,. |
|   17 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,%,+,+,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,. |
|   18 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,+,%,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,. |
|   19 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,#,%,%,+,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,. |
|   20 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,+,-,+,%, , , ,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,. |
|   21 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,+, ,+,#,#, , ,%,+,%,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,. |
|   22 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,@, , , , , , ,@, ,+,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,. |
|   23 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,%, , , , , , , ,%,-,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,. |
|   24 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,-,-,+, , , , , , , , , ,-,-,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,. |
|   25 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,-,-,-,-,+,@, , , , , , , ,+,-,-,-,-,-,-,-,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,. |
|   26 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,#,-,-,-,-,-,-,-,+,+, , , , , , , ,+,+,-,-,-,-,-,-,-,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,. |
|   27 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,+, ,%, ,-,-,-,+, ,+,%,%,%,@, , , , , ,%,%,+,@,+,@,%,-,-,-,-,-,-,+,-,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,. |
|   28 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-, , ,#, ,+,+,%, , , , , , , , , , , , , , , ,%, ,@,-,-,-,-,-,+,+,-,-,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,. |
|   29 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,+, , , , ,%, , , , , , , , , , , , , , , , , , ,%,%,+,+, ,%,+,%,#,-,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,. |
|   30 | .,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,+,#, , , , , , , , , , , , , , , , , , , , , , , , ,%, , , , ,+,+,-,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,. |
|   31 | .,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,+, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,. |
|   32 | .,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,+,+,%, , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,. |
|   33 | .,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,-,+, ,%, , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,%,+,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,. |
|   34 | .,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,@, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,+,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,.,.,. |
|   35 | .,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,%,+,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,+, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,.,.,. |
|   36 | .,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,+,+,-,-,-,-,-,-,+,-,-,-,-,-,-,-,-,-,+,%, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,+,+,+,-,-,,,,,,,,,,,,,,,,,,,,,,,,,.,. |
|   37 | .,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,%,+,-,-,-,-,-,+,+,-,-,-,-,-,-,-,-,-, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#,+,-,,,,,,,,,,,,,,,,,,,,,,,,,.,. |
|   38 | .,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-, ,%,+,+,-,-,+,@, ,-,+,-,-,-,-,-,+,%, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,-,-,,,,,,,,,,,,,,,,,,,,,,,,,.,. |
|   39 | .,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,+,@, ,@,+,+,@, ,+, ,+,-,-,-,-,+, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,+,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,.,. |
|   40 | .,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,+,@, , ,@, , , , , ,@,@,+,+,+,+,#, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,+,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,.,. |
|   41 | .,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,%, , , , , , , , , , , ,#,+,+,%, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,-,,,,,,,,,,,,,,,,,,,,,,,,,,,.,. |
|   42 | .,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,+,+,%,#, , , , , , , , , , , ,%,%,@, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,@,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,. |
|   43 | .,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,-,+, , , , , , , , , , , , , , , ,%, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,+,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,. |
|   44 | .,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,+,-,-,+,+,@, , , , , , , , , , , , , , ,#, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,. |
|   45 | .,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,%,+,+,+,%, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,@,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,. |
|   46 | .,.,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,-,-,-,-,-,-,+, ,@, ,@, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,. |
|   47 | .,.,,,,,,,,,,,,,,,,,,,-,-,-,%,-,-,-,-,-,-,-,-,%,-,+,%, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,+,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,. |
|   48 | .,.,,,,,,,,,,,-,-,-,-,-,-,-, ,+,-,+,+,+,+,-,+,%,%,%, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,+,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,. |
|   49 | .,.,,,,,,,,,,,,,-,-,-,-,-,-,%,-,-,-,-,-,-,-,-,+,+,@, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,+,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,. |
|   50 | .,.,,,,,,,,,,,,,,,,,,,,,-,-,+,-,-,-,-,-,-,-,-,-,-,+,%,#, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,. |
|   51 | .,.,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,-,-,-,-,-,+,@,@,@,%, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,+,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,. |
|   52 | .,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-, ,+,+,+,%, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,%,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,. |
|   53 | .,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,-,-,+,@, , , , , , , , , , , , , , ,@, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,. |
|   54 | .,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,#,#,#, , , , , , , , , , , , , ,%,@, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,+,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,. |
|   55 | .,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,+,%,@, , , , , , , , , , , ,%,+, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,%,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,. |
|   56 | .,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,@, , , , , , , , , , , ,%,+,+,%, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,%,-,,,,,,,,,,,,,,,,,,,,,,,,,,,.,. |
|   57 | .,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,+,@, , ,%, , , , ,#,@, ,+,+,+,+, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,+,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,.,. |
|   58 | .,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,+,+, ,%,%,+,+,%, ,+,@,+,-,-,-,-,+, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,+,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,.,. |
|   59 | .,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,%,+,+,+,-,-,+,#,+,-,-,-,-,-,-,-,-,%, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#,-,-,,,,,,,,,,,,,,,,,,,,,,,,,.,. |
|   60 | .,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,+,+,-,-,-,-,-,%,%,-,-,-,-,-,-,-,-,-, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,@,#,-,-,,,,,,,,,,,,,,,,,,,,,,,,,.,. |
|   61 | .,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,+,@, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,+,-,+,+,,,,,,,,,,,,,,,,,,,,,,,,,.,.,. |
|   62 | .,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,%, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,.,.,. |
|   63 | .,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,,,,,,,-,-,-,-,-,-,-,-,-,-,-,-,-, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#,+,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,.,.,. |
|   64 | .,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,+,#,+, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,+,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,. |
|   65 | .,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,-,+,%,#, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,. |
|   66 | .,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,+,@, , , , , , , , , , , , , , , , , , , , , , , , ,@, , , ,@,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,. |
|   67 | .,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,+,#, , , , , , , , , , , , , , , , , , , , , , , , ,+, , , , ,%,-,-,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,. |
|   68 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,%,%, , , ,@,+,@, , , , , , , , , , , , , , , , , ,%,+,-,+, ,+,+,+,%,-,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,. |
|   69 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,%, ,%,@,+,+, , , , , , , , , , , , , , ,#, ,%, , ,-,-,-,-,-,+,+,-,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,. |
|   70 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-, ,+,+, ,-,-,-,+, ,+, ,+,%,@, , , , , ,%,+,+,+,+,+,+,-,-,-,-,-,-,%,-,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,. |
|   71 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,@,-,-,-,-,-,-,-,+,+, , , , , , , ,+,-,-,-,-,-,-,-,-,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,. |
|   72 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,-,-,-,-,+,%, , , , , , , ,+,-,-,-,-,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,. |
|   73 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,-,+, , , , , , , , , ,-,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,. |
|   74 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,-,-,+, , , , , , , ,#,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,. |
|   75 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,+,%, , , , , , ,%,#,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,. |
|   76 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,+,%,+,%,@, , ,%,+,%,%,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,. |
|   77 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,+,-,+,%, , ,%,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,. |
|   78 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,+,%,%,+,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,. |
|   79 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,+,%,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,. |
|   80 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,%,+,@,+,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,. |
|   81 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,+,+,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   82 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,@,-,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   83 | .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,-,-,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   84 |  ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-,-,%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   85 |  ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   86 |  , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   87 |  , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   88 |  , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   89 |  , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   90 |  , , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   91 |  , , , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   92 |  , , , , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   93 |  , , , , , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,,,,,,,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. |
|   94 |  , , , , , , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,  |
|   95 |  , , , , , , , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., ,  |
|   96 |  , , , , , , , , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., , , ,  |
|   97 |  , , , , , , , , , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., , , , ,  |
|   98 |  , , , , , , , , , , , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., , , , , ,  |
|   99 |  , , , , , , , , , , , , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., , , , , , , ,  |
|  100 |  , , , , , , , , , , , , , , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., , , , , , , , ,  |
|  101 |  , , , , , , , , , , , , , , , , , , ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., , , , , , , , , , ,  |
+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
102 rows in set, 65535 warnings (0.21 sec)

 フォントを小さくして、画像で見せると、こんな感じになります。美しい。

f:id:sakaik:20200521164519p:plain
Mandelbrot by MySQL

変更点の解説

  • VALUES 文に ROW 記述が必要 x VALUES(0), o VALUES ROW(0)
  • FLOAT へのキャストは明記不要なので、削除
  • GREATEST() は集約関数としての動作はしないので、一旦キャラクタを決めるクエリをサブクエリとして作成
  • array_to_string() 関数はないので、MySQLでは GROUP_CONCAT() で。

 PostgreSQL版では、キャラクタの順序決め(array_agg() か array_to_string() するタイミング)で Ix を使った順序決めを行っていない点が気になりました。処理の都合上、期待通りに Ix順となるよう文字列が作られているようですが、このクエリを厳密に読み解くとその順序は「不定」ではないでしょうか。


 それにしても、CTEやWindow関数活用の先輩である PostgreSQL には、やはり面白いサンプルがいっぱいありますね。ほかにも試してみたくなりました。おもしろかった~。

追記

 よく見たら、膨大なワーニングが出ていた。

102 rows in set, 65535 warnings (0.21 sec)

 これは、FLOATを「さくっと消してしまった」ことによるもので、やはりここは丁寧にCASTすべきであった。

エラーの例:

| Note  | 1265 | Data truncated for column 'Y' at row 1 |


キャスト方法

     SELECT Ix, Iy, CAST(X AS FLOAT), CAST(Y AS FLOAT) , CAST(X AS FLOAT), CAST(Y AS FLOAT), 0

 これで WARNINGS は出なくなる。

MySQL: CHAR(0)の動作が変わっていた

 11年ほど前に書いた日記がふと目にとまりました。CHAR(0)という列を定義できるというお話。
sakaik.hateblo.jp


 当時のバージョンが明記されていないため、よくわからないのですが、最新の 8.0.20では挙動が変わっているようです。

mysql> CREATE TABLE t1 ( a CHAR(0), b VARCHAR(0));
Query OK, 0 rows affected (0.01 sec)

mysql>  INSERT INTO t1 VALUES ("ABCDE", "FGHI");
ERROR 1406 (22001): Data too long for column 'a' at row 1

 ちゃんとエラーとして動作するようになりました!(というか勝手に切り捨てるのをやめただけとも言う)
当時の実行結果で、WARNING をちゃんと見ておけばよかったと悔やまれますが、おそらく「自動で切り捨てられました」みたいな警告が出ていたのでしょうね。
 
 
 

mysql>  INSERT INTO t1 VALUES ("", "");
Query OK, 1 row affected (0.00 sec)

mysql>  INSERT INTO t1 VALUES ("", null);                                                                                        
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM t1;
+------+------+
| a    | b    |
+------+------+
|      |      |
|      | NULL |
+------+------+
2 rows in set (0.00 sec)

 ちゃんと(ゼロバイト以内の)値も入ります!


 ・・・・依然として、使い道はわかりません。

.

こんにちはこんにちはこんにちは!を出すSQL

 slack とかを使っていると、新たに部屋に参加した人は挨拶するじゃないですか。「こんにちは!」って。そしたら、既に部屋にいる人は「こんにちはこんにちは!」って返しますよね。その後に入ってきた人は、これを見て「こんにちはこんにちはこんにちは!」って挨拶したり、次の人は「こんにちはこんにちはこんにちはこんにちは!」って書き込んだり、しますよね。
 これを SQL でさくっと書けないか、と、とある チャンネルに @yoku0825 さんが書いた疑似SQLがこれ。

WITH RECURSIVE t AS 
   (SELECT 1 AS c, 'こんにちは' AS str 
    UNION ALL 
    SELECT c + 1, CONCAT(str, str) FROM t WHERE c < ?)
SELECT CONCAT(str, '!') FROM t;

 実はこれ、実行すると、

Data too long (ERROR 1406 (22001))

 というエラーになります。
yokuさんによると、「『シードのSELECTの時に型が決まっちゃうから…とか』だっけ?」ということで、キャストするといいんじゃないか、というのは @tmtms さんのアイデア

WITH RECURSIVE t AS 
  (SELECT 1 AS c, CAST('こんにちは' AS CHAR(1000)) AS str 
    UNION ALL 
    SELECT c + 1, CONCAT(str, str) FROM t WHERE c < 10) 
SELECT CONCAT(str, '!') FROM t;

 この挙動についてはマニュアルにも説明があります(@tmtmsさん情報):
MySQL :: MySQL 8.0 Reference Manual :: 13.2.15 WITH (Common Table Expressions)



 これで、エラーなく実行されるのだけど、実は初期アイデアにちょっとした問題があって、 CONCAT(str, str) としていることで、文字列がひとつずつ長くなるのではなく倍々になっていっていまうのですね。そんなわけで、

WITH RECURSIVE t AS 
  (SELECT 1 AS c, CAST('こんにちは' AS CHAR(1000)) AS str 
   UNION ALL 
   SELECT c+1, CONCAT(str, 'こんにちは') FROM t WHERE c < 10)
 SELECT CONCAT(str, '!') greeting FROM t;

実行結果は、こんな感じ。

mysql> WITH RECURSIVE t AS 
    ->   (SELECT 1 AS c, CAST('こんにちは' AS CHAR(1000)) AS str 
    ->    UNION ALL 
    ->    SELECT c+1, CONCAT(str, 'こんにちは') FROM t WHERE c < 10)
    ->  SELECT CONCAT(str, '!') greeting FROM t;
+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
| greeting                                                                                                                                                  |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
| こんにちは!                                                                                                                                              |
| こんにちはこんにちは!                                                                                                                                    |
| こんにちはこんにちはこんにちは!                                                                                                                          |
| こんにちはこんにちはこんにちはこんにちは!                                                                                                                |
| こんにちはこんにちはこんにちはこんにちはこんにちは!                                                                                                      |
| こんにちはこんにちはこんにちはこんにちはこんにちはこんにちは!                                                                                            |
| こんにちはこんにちはこんにちはこんにちはこんにちはこんにちはこんにちは!                                                                                  |
| こんにちはこんにちはこんにちはこんにちはこんにちはこんにちはこんにちはこんにちは!                                                                        |
| こんにちはこんにちはこんにちはこんにちはこんにちはこんにちはこんにちはこんにちはこんにちは!                                                              |
| こんにちはこんにちはこんにちはこんにちはこんにちはこんにちはこんにちはこんにちはこんにちはこんにちは!                                                    |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
10 rows in set (0.00 sec)



 ちなみに、キャストしている char(1000) の 1000 には特に細かい意味はなくて、512までは VARCHAR、513から16383までは text、16384以上になると longtext になります。

mysql> drop table t2; create table t2 as SELECT CAST("ABCD" as CHAR(512)) c1;desc t2;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| c1    | varchar(512) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+

mysql> drop table t2; create table t2 as SELECT CAST("ABCD" as CHAR(513)) c1;desc t2;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| c1    | text | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+
mysql> drop table t2; create table t2 as SELECT CAST("ABCD" as CHAR(16383)) c1;desc t2;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| c1    | text | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+

mysql> drop table t2; create table t2 as SELECT CAST("ABCD" as CHAR(16384)) c1;desc t2;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| c1    | longtext | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+

 
 今回の実行結果を新規テーブルに入れると、 text ではなく longtext になる理由は、不明。

mysql> CREATE TABLE t5 AS
    -> WITH RECURSIVE t AS (SELECT 1 AS c, CAST('こんにちは' AS CHAR(1000)) AS str UNION ALL SELECT c+1, CONCAT(str, 'こんにちは') FROM t WHERE c < 10)
    ->  SELECT CONCAT(str, '!') FROM t;
Query OK, 10 rows affected (0.12 sec)
Records: 10  Duplicates: 0  Warnings: 0mysql> desc t5;                                                                                                                  
+--------------------+----------+------+-----+---------+-------+
| Field              | Type     | Null | Key | Default | Extra |
+--------------------+----------+------+-----+---------+-------+
| CONCAT(str, '!')  | longtext | YES  |     | NULL    |       |
+--------------------+----------+------+-----+---------+-------+



あぁ面白かった。ところでこれ、1個からn個までの こんにちは をリストにして出しているけど、そもそもリストじゃなくて、n回目の挨拶文だけ得られれば十分だったんじゃないの?

mysql> SELECT CONCAT(REPEAT('こんにちは',5),'!') greeting; 
+--------------------------------------------------------------------------------+
| greeting                                                                       |
+--------------------------------------------------------------------------------+
| こんにちはこんにちはこんにちはこんにちはこんにちは!                           |
+--------------------------------------------------------------------------------+


 
 こんなことをわいわいやっている、MySQLコミュニティ界隈、MySQLユーザ会、MySQLについて興味を持ったら、2020年5月25日(月) 19時から開催される 「MySQLユーザ会20周年&MySQL25周年記念イベント@Zoom」にもぜひご参加ください。ウェビナー形式です。
mysql.connpass.com

Oracle 19c 環境をてにいれた!

時々、Oracle Database 環境を触りたくなるタイミングがあって、でも最近は OTN の契約もしていないから(単なる興味のために、そこそこのお金を払うのは)難しいかなぁと思っていたところに、@ora_gonsuke777 さんから さくっと入れられる VM環境を教えていただきました。ありがとうございます!


教えていただいたページは、こちら。
qiita.com


 この日記は、柴田さんのブログを見ながら実際に試してみた記録です。基本的に柴田さんの記事の劣化コピーですので、自分でやってみよう、という方は上記ブログのほうを参照したほうが良いかと思います。

環境準備

  • DeveloperDaysVM2019-05-31_20.ova をDLして適当なフォルダに。
  • Virtual Box の ファイル - 仮想アプライアンスのインポート で、ダウンロードしたファイルを指定
    • 次へ ボタンを押して内容確認して「インポート」ボタン(2,3分くらいかかったかな)
  • VMの一覧に追加されているので 「Oracle DB Developer VM」を起動
    • 起動完了し shell の窓がひとつ開いている状態になる
    • shell窓の中には、以下のひょうな表示がされている。接続をする際などに色々必要となりそうな情報
Database Information:
Oracle SID    : orclcdb
Pluggable DB  : orcl
Pluggable DB  : ords create if required by running: 
    'newpdbords' in the terminal - for ORDS pdb creation.
         (if 'sqlplus system/oracle@ORDS' connects ORDS pdb has already been installed)
    'loadstorm' in the terminal for spatial demo data - takes a few minutes.

ALL PASSWORDS ARE : oracle

*** Please note that this appliance is for testing purposes only, 
as such it is unsupported and should not be used as a production environment.

try JDBC REST driver: sql HRREST/oracle@http://localhost:8080/ords/hrrest/

ssh での接続

  • VirtualBoxの デバイス - ネットワーク - ネットワーク設定 で「高度」を開いてから「ポートフォワーディング」ボタンで、設定を確認できる
 NAME      Prot. Host  Guest
 apex8080  TCP  8080  8080
 apex8081  TCP  8081  8081
 net8      TCP  1521  1521
 ords9090  TCP  9090  9090
 ssh       TCP  2222    22 
  • ホストマシン(Windows)側から、poderosa を使って ssh 接続する
    • うまく繋がらずに暫く悩んだが、最終的には VirtualBox の デバイス - ネットワーク の「ネットワークアダプタを接続」がオフになっていたことが原因だったっぽい。オンにしたらあっさりつながった
    • localhost の 2222ポートに接続する
    • 色々試している過程で セキュリティソフト(ESET)のネットワーク保護を一時的に無効にした状態のときに成功したが、その後、有効にしても新たな接続ができたので、たぶん関係ないと思う。
  • Oracle へのコマンドラインでの接続は、いくつかの環境変数をセットしてsqlplus で実施
[oracle@localhost ~]$ export ORACLE_HOME=/u01/app/oracle/product/version/db_1/
[oracle@localhost ~]$ export PATH=${PATH}:${ORACLE_HOME}/bin
[oracle@localhost ~]$ sqlplus /nolog
SQL*Plus: Release 19.0.0.0.0 - Production on Mon May 4 10:18:59 2020


SQL> CONNECT SYS/oracle@ORCLCDB AS SYSDBA
Connected.

SQL> SELECT * FROM ALL_TABLES;
 :
  • これで結果を得られるけど、その前に ページの幅と高さを設定しておいたほうがいいみたい
SQL> SET LINESIZE 170;
SQL> SET PAGESIZE 100;

ブラウザで apex

  • ブラウザでアクセス
  • 本ツールでできること、使い方等は全然知らないので、今後必要になったときに別途お勉強

SQL Developer でアクセス

  • WINDOWS.X64_193000_client.zip をダウンロードしてインストールした。
    • でもこれじゃなかったかもしれないし、これはこれで必要だったのかもしれない
  • sqldeveloper-19.1.0.094.2042-x64.zip をダウンロード
  • 展開して、sqldeveloper.exe を起動
  • "Oracle接続" 右クリックで「接続の作成」。以下を入力して「接続」ボタン。
ユーザー名:PDBADMIN
ホスト名 :localhost
ポート  :1521
サービス名:orcl
  • SELECT * FROM ALL_TABLES を実行してみた。

今後

  • コマンドラインで dbish を使えるようにしたいが、入れ方不明。調べる。
  • テーブル作成は権限不足で失敗。実験用に自分のスキーマを作りたいのだけど、どうやって作るのだったか。
    • 確かユーザを作ると、その人の持ち物としてスキーマが存在するんだったっけ?
    • 20年くらい触っていないのでこのレベルからお勉強しなおしかな~。
  • spatial オプションが、最新のOracleでは(オプションではなく)使えるようになっていると聞いたので、それは試してみたいところ

MySQLで未定義のユーザ変数の表示がおかしい(8.0.20)

MySQL では @ で始まるユーザ定義変数を使うことができます。

mysql> SET @v1=123, @s1="ABC";
Query OK, 0 rows affected (0.00 sec)

 こんなふうに定義すると、SELECTなどで使うことができます。
ここで、上で定義した2つの変数と、未定義の変数をSELECT文で見てみると:

mysql> SELECT @v1, @s1, @t1;
+------+------+------------+
| @v1  | @s1  | @t1        |
+------+------+------------+
|  123 | ABC  | 0x         |
+------+------+------------+

 上で値をセットした v1, s1 は、それぞれセットしたとおりの値が表示されていますが、未定義の @t1 には "0x" と表示されてしまいました。


 値が NULL だとそうなるのか?

mysql> SET @s1=NULL;

mysql> SELECT @v1, @s1, @t1;                                                                                                     
+------+------+------------+
| @v1  | @s1  | @t1        |
+------+------+------------+
|  123 | NULL | 0x         |
+------+------+------------+

 そうではないようです。
ブランクなら?

mysql> SET @v1="";
mysql> SELECT @v1, @s1, @t1;
+------+------+------------+
| @v1  | @s1  | @t1        |
+------+------+------------+
|      | NULL | 0x         |
+------+------+------------+

 セットしたとおりにブランクが出力されます。
じゃぁ未定義の値に書き換えてしまえば再現するのでは?と試してみると

mysql> set @v1=@xxx;

mysql> SELECT @v1, @s1, @t1;
+------+------+------------+
| @v1  | @s1  | @t1        |
+------+------+------------+
| NULL | NULL | 0x         |
+------+------+------------+

 NULL になってしまう。
ちなみに、未定義の変数に未定義の値を代入すると、NULLにはならず、未定義的な値が出力されます。

mysql> SET @u1=@u2;                                                                                                              

mysql> SELECT @u1, @u2;
+------------+------------+
| @u1        | @u2        |
+------------+------------+
| 0x         | 0x         |
+------------+------------+


 最初の値に戻って、HEXを取ってみると、未定義のところは、やっぱり未定義である模様(=何か不可視な値が入っているわけではない)。

mysql>  SET @v1=123, @s1="ABC";  
mysql> SELECT HEX(@v1), HEX(@s1), HEX(@t1);
+----------+----------+----------+
| HEX(@v1) | HEX(@s1) | HEX(@t1) |
+----------+----------+----------+
| 7B       | 414243   | NULL     |
+----------+----------+----------+


ちなみにこの事象、
MySQL 8.0.20:

mysql> SELECT @v1, @s1, @t1;
+------+------+------------+
| @v1  | @s1  | @t1        |
+------+------+------------+
|  123 | ABC  | 0x         |
+------+------+------------+


MySQL 8.0.19:

mysql> SELECT @v1, @s1, @t1;
+------+------+------------+
| @v1  | @s1  | @t1        |
+------+------+------------+
|  123 | ABC  | 0x         |
+------+------+------------+

MySQL 8.0.17:

mysql> SELECT @v1, @s1, @t1;
+------+------+------------+
| @v1  | @s1  | @t1        |
+------+------+------------+
|  123 | ABC  | NULL         |
+------+------+------------+

8.0.18 は、ちょうど手元に使える環境がなかったので未確認。
8.0.18または19になったときに挙動が変わったようですね。


と、ここで今回も救世主登場。 いつもいつも、皆さんありがとうございます。

ということで、「発生しなかった」MySQL 8.0.17 の mysqlクライアント起動オプションを変更して、リトライ!

MySQL 8.0.17:

$ mysql -uroot -p --binary-as-hex
 : (略)
mysql> select @n1;
+------------+
| @n1        |
+------------+
| 0x         |
+------------+

 なったぁ!!!!


結論:
mysqlクライアントで、binary_as_hex の時には、未定義のユーザ変数は "0x" と出力される』

  ・・・・という仕様、、、、、と言っていいのかな。言いたくないな(笑)。
少なくとも 8.0.19以降変わったのは mysqlクライアントの binary_as_hex のデフォルト値だけであり、挙動そのものは、もともとそういうものだったのかもしれません。
(そして NULL に対しては表示処理で NULLを返すけど、未定義に対してはHEX化をトライしてしまうという、、やっぱり単に if 文の条件抜けのような気がしないでもない(昔から))


MySQL 8.0.19 リリースノートより:

When the mysql client operates in interactive mode, the --binary-as-hex option now is enabled by default. In addition, output from the status (or \s) command includes this line when the option is enabled implicitly or explicitly:

Binary data as: Hexadecimal

To disable hexadecimal notation, use --skip-binary-as-hex (Bug #24432545)

 たしかに、STATUS出力に新しい項目が1行加わっている!

mysql> status

                          • -

mysql Ver 8.0.20 for Linux on x86_64 (MySQL Community Server - GPL)

Connection id: 11
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 8.0.20 MySQL Community Server - GPL
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
UNIX socket: /var/run/mysqld/mysqld.sock
Binary data as: Hexadecimal
Uptime: 3 hours 49 min 39 sec

Threads: 3 Questions: 61 Slow queries: 0 Opens: 558 Flush tables: 4 Open tables: 36 Queries per second avg: 0.004

MySQL: COUNT(*) は 1 ??

Twitterに書き殴ったのですが、流れてしまうので、一応こちらにもまとめておこうかと。


 コトの発端はちょっとした打ち間違いだったのですが、MySQL は FROM 書かなくても演算できます。こんな感じ。

mysql> SELECT 3;
+---+
| 3 |
+---+
| 3 |
+---+

mysql> SELECT SQRT(64);
+----------+
| SQRT(64) |
+----------+
|        8 |
+----------+

 ここで、SELECT COUNT(*) とすると何が返ってくるのか。そう、 1 が返ってきます。

mysql> SELECT COUNT(*);
+----------+
| COUNT(*) |
+----------+
|        1 |
+----------+

 EXPLAIN取って、出てきた WARNING を見てみると、どうも COUNT(0) として解釈され、処理が行われている模様。

mysql> EXPLAIN SELECT COUNT(*);
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra          |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
|  1 | SIMPLE      | NULL  | NULL       | NULL | NULL          | NULL | NULL    | NULL | NULL |     NULL | No tables used |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
1 row in set, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+-------+------+----------------------------------------------+
| Level | Code | Message                                      |
+-------+------+----------------------------------------------+
| Note  | 1003 | /* select#1 */ select count(0) AS `COUNT(*)` |
+-------+------+----------------------------------------------+
1 row in set (0.00 sec)


じゃぁ、* は、FROMがないときはゼロ相当なのか、というと、そうでもない。

mysql> SELECT *;                                                                                                                 
ERROR 1096 (HY000): No tables used


 カッコ付ければいいってもんでもない。

mysql> SELECT (*);                                                                                                               
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*)' at line 1

 念のため言っておくけど、no tables だからって、FROM dual をつければいいってもんでもない。

mysql> SELECT * FROM dual;
ERROR 1096 (HY000): No tables used


 と悩んでいるところに、神降臨。



結論。

『dual 表(MySQLでは通常、記述を省略)は、1件を返す』