文脈を理解する自動補完
「FROMにいるのか、WHEREにいるのか、列の一覧にいるのかを、エディタは知っています。」
入力は少なく、間違いも少なく。候補が、文の中のどこにいるかを理解しているからです。
アクティブなテーブルの列、データベース名、スキーマのトークン(テーブル、ビュー、関数)、DML/DDL/制御のキーワード、データ型、エンジンで絞り込んだSQLの補助フレーズを提案します。
入力中の字句リンター
「対応の取れていない括弧が、サーバに届くことはありません。」
サーバに拒否される前に、明らかな間違いを捕まえます。
閉じていないコメント、閉じていない文字列、対応の取れていない括弧、閉じていないバッククォートの識別子を検出します。O(n)の走査で、完全なパーサは使いません。
フォーマッタと、セーフモード
「DROPがうっかり出ていくことはありません。」
クエリーを読みやすく整形し、意図する前にUPDATEやDROPがサーバに届かないようにする鍵。
フォーマッタは、エンジン自身の語彙からキーワードを大文字にします。セーフモードは標準でオンで、プロファイルごと、エディタのタブごとに保存され、ALTER、CREATE、DELETE、DROP、GRANT、TRUNCATE、UPDATE、REPLACE、RENAMEを含む文の実行を拒否します。エディタからでも、ターミナルからでも、SQLプレーヤーからでも同じです。探すのは単語で、WHEREではありません。WHERE付きのUPDATEも止まり、オフにするまで何も送られません。
ログと同期での認証情報の伏せ字化
「同期するのは履歴で、認証情報ではありません。」
クエリーログが、iCloud上のパスワードファイルになることはありません。
IDENTIFIED BY、IDENTIFIED WITH … AS、IDENTIFIED BY PASSWORD、SET PASSWORD FOR、PASSWORD(…)を無害化します。伏せ字化は冪等で、クエリーログをCloudKitに書き出す前に適用されます。
ビジュアルなクエリービルダー
「クリックでクエリーを組み立て、そのまま本番で使える形で出てきます。」
構文を覚えなくても、正しいSELECT … WHERE … JOIN …が書けます。
最もよく使う4つの形のための専用のビジュアルビルダー:SELECT、WHERE、UPDATE、そしてテーブルのCREATE。
単語の境界を守るシンボル名の変更
「client_idを壊さずにidの名前を変えます。」
似た名前を壊さずに、識別子を安全にリファクタリングできます。
\bの単語境界と正しいエスケープを使った正規表現。より長い識別子の中に一致することはありません。
クイックオープンのパレット(⌘⇧O)
「⌘⇧Oで、探していたテーブルにいます。」
ツリーをたどらずに、スキーマのどのオブジェクトにも届きます。
テーブル、ビュー、ルーチン、オブジェクトをまたぐインクリメンタルなあいまい検索。矢印キーで移動し、Enterで開きます。
エンジンごとの初期データを持つスニペットマネージャ
「スニペットがエンジンに合わせます。その逆ではありません。」
SQLのレシピがいつも手元にあり、使っているエンジンで絞り込まれます。
snippets.jsonに保存され、全体の同期スイッチでiCloudを通って運ばれ、オフならデバイスに残ります。スニペットごとに、どのエンジン(MySQL、MariaDB、PostgreSQL…)に当てはまるかを宣言します。新しいエンジンに接続すると、重複なしで初期値が入ります。カテゴリ分けもできます。
DDLと関数のドキュメントのポップオーバー
「GROUP_CONCATのドキュメントが、入力しているその場所で開きます。」
エディタを離れず、ブラウザも開かずに読めるドキュメント。
カーソルの下にあるスキーマのオブジェクトのDDL、または関数の項目(シグネチャ、説明、パラメータ、例、登場したバージョン)を表示します。エンジンごとに専用の項目があり、SQLiteとDuckDBも含みます。クエリーのツールでは、MongoDBの演算子にもあります。マウスを使わないなら⌥⌘?。
高度なセルエディタと、行のその場での編集
「セルを編集し、SQLを見て、決める。」
データをすばやく変更し、実行される正確なSQLをプレビューできます。
結果セットを表計算のように編集し、実行する前に、生成されたUPDATEやDELETEをプレビューします。
SQLプレーヤー — スクリプトを1文ずつ
「スクリプトを動画のように、再生し、一時停止し、1文ずつ進める。」
移行を1文ずつ実行し、次の文を送る前にそれぞれの結果を確かめられます。
エディタのスクリプトを文に分け、手動またはタイマーで1つずつ実行します。最初、前、次、最後のコントロール付きで、自動再生は最初のエラーで止まります。それぞれの文には、状態、時間、返した行数や変更した行数が表示され、クエリーの履歴にも残ります。セーフモードが適用されます。
エディタにドッキングしたSQLターミナル
「アプリを離れずに、mysql>のプロンプト。」
文を入力し、Returnを押し、答えをテキストで読む。コマンドラインのクライアントと同じやり方を、スクリプトのすぐ隣で。
エディタの下のパネルに、エンジン自身のプロンプト(mysql>、postgres=#…)、ASCIIの表での結果、サーバが変更したと伝える行数付きの「Query OK」、その下にサーバの警告。Macでは矢印キー、iPad、iPhone、Apple Vision Proではボタンで使える専用の履歴があり、すべての文はセッションの履歴にも入ります。セーフモードが適用されます。
結果のグラフ
「何も書き出さずに、結果セットからグラフへ。」
いま得た行から、棒グラフ、折れ線グラフ、円グラフを、エディタのパネルに。
軸は自動で選ばれます(カテゴリには最初のテキストの列、値には最初の数値の列)。変更もできます。グラフはPNGやPDFに書き出せます。
ひとつのクエリー、2つのデータベース
「ステージングは本番と同じ?両方に一度に聞いてみましょう。」
同じクエリーを2つの接続で実行し、何が違うかを行ごとに見られます。
「2つのデータベースで実行…」は、文を両方に送り、グリッドを比較に置き換えます。変わったセルには印が付き、片方にしかない行が示され、違いだけを表示するフィルタもあります。行は位置で対応づけられ、両方が同じ列を返したときだけ比較します。
キーボードの上のiPadのヒントバー
「SQLの力を持つiPadのキーボード。」
画面上のキーボードのすぐ上に、タッチですばやく選べる候補。
カーソルの下のオブジェクトや関数に応じたバーで、「DDLを表示」や関数のパラメータにすぐアクセスできます。
カスタマイズできるツールバー
「あなたの順番の、あなたのツールバー。」
使いやすさは人それぞれです。DBAは一度並べ替えたら、あとは忘れます。
専用のカスタマイズ用シートで、ボタンのグループを並べ替えたり隠したりできます。配置は保存されます。
データベース全体の一括検索と置換
「持っているすべてのテキスト列を、一度に検索。」
すべてのテーブルのすべてのテキスト列で文字列を一度に検索し、テーブルと列ごとの一致を見て、サーバが計算した結果をプレビューし、テーブルごとのトランザクションの中で一括置換します。
表示する件数は1つではなく2つです。照合順序はふつう大文字と小文字を区別せず、REPLACE()は常に区別するので、その警告がなければ、一括編集は300行と告げて100行しか変えず、しかも何も失敗しません。この食い違いは、名前付きの照合順序ではなくCAST(col AS BINARY)で測ります。生成列、主キーの列、一意の列は標準で除外されます。MariaDBは生成列へのUPDATEを受け付け、影響を受けた行を1と報告して、何も変えないからです。エスケープには|を使います。バックスラッシュはNO_BACKSLASH_ESCAPESのもとで壊れるからです。
本物の地図の上の空間データ
「GEOMETRY列が、25バイトのかたまりではなくなります。」
点、線、多角形を、エディタにドッキングした地図の上に描きます。航空写真と平面のスタイル、クラスタリング、データに合わせるコントロール付きです。ピンや頂点をドラッグするとCalíopeが文を組み立て、何かを書き込む前にそれを見せます。
ワイヤ上のWKBは常に(経度、緯度)です。変わるのはテキストで、地理座標系のSRIDのもとではMySQL 8は緯度を先に書き、MariaDBは決してそうしないからです。入れ替えはテキストの境界にだけあり、そこではパラメータに既定値がありません。間違えてもエラーにはならず、行が別の大陸に移り、サーバはそれを受け入れます。SRIDはジオメトリと一緒に運ばれ、信頼できる主キーがなければ編集は止められてその理由が表示され、CoreLocationはどこにもありません。